Equals always symmetric. Tighten definition for equality between differing types which iterate similarly
Ensure hash has properties we desire.

hash of iterables now ensures that hashes are not affected by iteration order for non-ordered iterables, while ordered iterables hash differently based on iteration order. Keyed iterables hash differently from indexed or set iterables.