Effect Memory Optimizations

This PR makes changes to how Effects are created to reduce their memory usage at runtime.

The most useful fix was replacement of our uses of List<> with fixed sized arrays.  We had lots of places where the List<> had one element in it...  but under the hood List<> allocates in chunks.  So you would have this totally unused memory floating around in largely empty lists.

Second I switched to explicit Clone() methods for the collections instead of constructors.  This allows for example to EffectAnnotationCollection.Clone() to return a shared "empty" collection instead of allocating a new one.  This also saved alot of memory.

My test was allocating 10,000 BasicEffect objects and measuring the system memory using the GC methods.

Before: 87MB
After: 61MB

So overall a 29% reduction in memory usage.  My goal moving forward is to reduce this even greater, but this will take some deeper changes to how EffectParameter and EffectPass work.