Implement #zip for Stream

This operation takes a stream and zips the receiver and the argument together. This essentially results in a Stream that doesn't occur until both input streams have and will contain events that are tuples of corresponding input events (so `[left_event, right_event]`). This means that we have #merge to create a stream that occurs whenever either inputs occur and #zip for when both have occurred (sort of like and `&` and `|` for Streams in a way).

This actually introduces a small performance problem as zipping one stream that occurs very rarely with another that occurs frequently will cause the latter to buffer a lot and so it will consume a lot of memory.

P.S. This #zip operation only allows you to zip two streams together at the moment. If we wanted the Stream API to be interchangeable with Enumerable it will need to take an arbitrary number of streams. For the moment though I felt this provided a nice amount of functionality.