Returns a new
Iterator that allows iterating the elements of this
Iterable classes may specify the iteration order of their elements
List always iterate in index order),
or they may leave it unspecified (for example a hash-based
may iterate in any order).
iterator is read, it returns a new iterator,
which can be used to iterate through all the elements again.
The iterators of the same iterable can be stepped through independently,
but should return the same elements in the same order,
as long as the underlying collection isn't changed.
Modifying the collection may cause new iterators to produce
different elements, and may change the order of existing elements.
List specifies its iteration order precisely,
so modifying the list changes the iteration order predictably.
Set may change its iteration order completely
when adding a new element to the set.
Modifying the underlying collection after creating the new iterator
may cause an error the next time
Iterator.moveNext is called
on that iterator.
Any modifiable iterable class should specify which operations will
Iterator<E> get iterator => new ListIterator<E>(this);