Fixes a bug where enumerating multiple times would fail on some operations.

The operations deriving from Iterator were not correctly returning a new enumerator (or otherwise resetting the enumerator) when GetEnumerator was called on the enumerable.  This resulted in enumerables that could only be enumerated one time.

Removes the Iterator base class and explicitly implements the enumerator and enumerable separately.  This should help prevent such bugs in the future.