AOT formatters cannot access private members of the types they format today.
This is a blocker for "always on" AOT source generation of MessagePack serializable types.
As a solution, I propose that we generate formatters as nested types within the types that they format. This would be a substantial breaking change for existing users because they have to change their type declarations to be partial. To minimize this, we should only generate the formatters as nested when they need to access private or protected members. For all-public formatters, they can remain as nested types under the source generated resolver.
@pCYSl5EDgo shared some code to help us get this right, since nesting formatters under the type to be formatted may require multiple levels of nesting, for a variety of types all the way up to the namespace (which may or may not be there itself).