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.
See pull request #2725 .