ContentTypeReader Caching

This is a fix for https://github.com/mono/MonoGame/issues/2687.

In this PR I established a static cache of `ContentTypeReader`s so that we don't continue to create and release them over and over on each call to `ContentManager.Load<T>()`.  This is not only a big reduction in garbage generation, but it also should slightly improve performance.

I also included a major refactor of `ReflectiveReader<T>` which moves all the reflection and other guess work into initialization.  This means reading the content does as little work possible which is a huge win on games that have lots of reflective types.

Also ran across a fix for `EnumWriter<T>` which I included here.
I looked into optimizing this further, but most techniques required Emit or Expression which use runtime code generation that cannot work on AOT systems.  There are other techniques that maybe we could apply here, but I didn't have time to test them.