Avoid boxing ImmutableHashSet<T>.Enumerator.

This introduces a pattern that can be applied anywhere to conveniently avoid boxing one's own Enumerator struct without duplicating the body of foreach loops everywhere.
Slight syntax touch-ups in response to feedback.
Remove erroneous use of GetEnumerable.

Its use on HashSet<T> is not necessary. The local variable is already strongly typed and will get the struct enumerator. In fact GetEnumerable would have made this code worse.
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).
Apply enumeration enhancement to ImmutableSortedSet<T>
Apply enum pattern to ImmutableList<T>

It turns out it only applies in one place. But as it is RemoveRange and if it has an empty list as an argument we'd like it to be fast, it seems worthwhile.
Merge pull request #223 from AArnott/fix211

Avoid boxing ImmutableHashSet<T>.Enumerator and others