Add an interface and implementation to iterate over containers
The Iterator interface has been extended to specify the return type of
the current method. Having this interface helps with static analysis and
keeps code clean by not having to add type hints. A basic implementation
based on IteratorIterator
has been added.