Convert to new iteratee-based enumeration

Details are described in the Enumerable docs.
This new implementation allows us to implement interleaving
functions (like zip) while avoiding a huge penalty in regular
enumeration.
Make the reducer function part of the suspended continuation
Improve docs
Add Stream.zip/2
Ensure certain streams and enumerables are zippable
Change Enumerable.count/1 and Enumerable.member?/2 to return tagged tuples

The motivation behind this change is to not force every application
to implement count/1 and member?/2 manually. It also allows us in
the future to add functions like Enum.counted?/1 that will return
true if count is pre-calculated.
Start sharing reducers in between Enum/Stream
Add Stream.each/2
Add Stream.take_every/2
Support Stream.take/2 with negative count
Support Stream.drop/2 with negative count
Add Stream.chunks_by/2
Add Stream.chunks/2,3,4
Add Stream.uniq/2
Add Stream.scan/2 and Stream.scan/3