Return singleton enumerators from IEnumerable.GetEnumerator for empty collections (#82499)
* Return singleton enumerators from IEnumerable.GetEnumerator for empty collections
Change the `IEnumerable<T>.GetEnumerator()` implementations on our core collection types to special-case Count==0 in order to return a single enumerator instead of allocating one a new each time. This saves an allocation when enumerating these collections via the interface in exchange for an extra length check as part of GetEnumerator.
* Address PR feedback
- Create helper function for empty enumerator
- Add tests for singletons
* Fix a few tests