Fix handling of IDisposable enumerator structs.

In adding code to opt-in ImmutableArray to the GetEnumerable extension method, I noticed it didn't work because ImmutableArray`1+Enumerator didn't implement IEnumerator<T> (because it doesn't want to be disposable to reduce code gen size). This called to my attention that the EnumeratorAdapter`2 type didn't implement IDisposable itself, so it would not recycle the stacks used by our several AVL-tree based collection's stack objects used by their enumerator structs.

To fix this, I introduced DisposableEnumeratorAdapter. So we have adapter structs for both cases: disposable and not disposable. Since C# doesn't allow overloads of methods that vary only on generic type argument constraints, this requires that the caller of the extension methods call the right method for their struct type. I've put a constraint on one method and a debug.assert on the other method to help flow callers into the right buckets and verified that a mistake produces either a compile error or a test failure.

I stop short of actually opting ImmutableArray<T> into the pattern (in this commit anyway) because it caused test failures since the types of exceptions thrown from uninitialized ImmutableArray<T> structs changed (due to calling a different GetEnumerator method).