+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 
I have not yet read beyond the test procedure, but I think there is some opportunity for boilerplate reduction when declaring states:
~~~scala
override def initialState = State[T](ReadAny(input1, input2)) { (ctx, input, element) =>
    ctx emit element
    SameState
  }
~~~
The second type parameter can be taken from the surroundings by putting the `State` object into the `MergeLogic[T]`.