This cleans up registries and turn mapper registry into a dynamic registry that can compile and cache mappers on the fly. The second step after this is merged is to remove global mapper/struct caches and use a per-rom-container cache that we pass into compilers. The third step is to do the exact same thing with CommandRegistry, so that it can build commands on the fly and relations won't have to deal with command compilers.
This cleans up registries and turn mapper registry into a dynamic registry that can compile and cache mappers on the fly. The second step after this is merged is to remove global mapper/struct caches and use a per-rom-container cache that we pass into compilers. The third step is to do the exact same thing with CommandRegistry, so that it can build commands on the fly and relations won't have to deal with command compilers.