Unlike for simpler types, struct types have a runtime cache, that's used to ensure same type can be compared to same pointer. The existing code was bypassing it, potentially breaking that invariant. One potential issue would be when decoding/encoding types, the resulting type would be pointer-different than what was stored.
This hasn't caused a visible issue, but the (incomplete) special handling for struct builtins is in the way of other changes.
Change the code to use get_struct_instance(), and also only ever load those if the parser need the types, since some of them are deprecated types that we might never want to load.
Includes one extra preparation patch.