[runtime] Use mono_class_load_from_name to load types in mono_defaults.
We can use mono_class_load_from_name in all cases that we previously used to assert after loading.
All optional types have being moved over to use GENERATE_TRY_GET_CLASS_WITH_CACHE.
All but System.Runtime.ConstrainedExecution.CriticalFinalizerObject which is used within
sgen and we must ensure we don't try to lazy load it there.
I'm not 100% sure whether it should be optional, maybe it's a leftover from the 1.0 -> 2.0 timeframe?
The problem is that marking more types as required would be a burden on linkers as they might not force
it to be preserved.
I'm not particularly happy with the current large set of types that are loaded upfront. A significant
number of them could be lazy loaded.