+str #15079 Add 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 
It is fair in that sense that after dequeueing from an input it yields to other inputs if they are available.  Or in other words, if all inputs have elements available at the same time then in finite steps all those elements are dequeued from them.