fix #4718, Zip iterator was impure

this also makes it faster, and special-cases zipping 2 iterators
other iterators updated to be immutable