Prototype of flexible merge

Still only a prototype, but would be great with a round of feedback for tomorrow's work.

I tried the "return next behavior" approach (see savepoint1 if you are interested), but that was a dead end. We want to allow return of behavior with new input and output types, e.g. Zip, and I couldn't get that to work without explosion of types. Reverted back to become.

// cc @drewhk @sirthias 
this is a bit tricky, we have multiple flags, completed, pending and depleted. You want the depleted flag (completed means onComplete has been received, pending means there are elements in the buffer, so you can have completed = true && pending = true).