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 as we have a lot of empty collections in Effects.

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.  

Still each BasicEffect eats up 6K of memory each... which is sort of fat IMO.

My goal moving forward is to reduce this even greater, but this will take some deeper changes to how EffectParameter and EffectPass work.