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.
Line 193 can throw an ArgumentNullException: In my test project one content reader is an ExternalReferenceReader. ExternalReferenceReader.TargetType is always null.
I guess this line should be extended like this?
```csharp
var targetType = contentReaders[i].TargetType;
if (targetType != null)
    _contentReaders.Add(targetType, contentReaders[i]);
```