+str: Implement efficient stream op DSL

Explanation in the doc comment for Interpreter
The name is misleading indeed. Let me explain though. I will use the old pinball terms since it is very graphic. When a Deterministic Op issues a finish, it divides the chain to two separate regions between which the ball cannot pass -- therefore one side of the finish might miss a ball. When we want to act on an onUpstreamFinish we cannot send an element if the ball is bouncing downstream since we would violate the exactly-one property by adding a new ball. On the other hand if the ball was bouncing upstream when we received the finish then we *must* inject a new event otherwise we get stuck forever since all downstream waits for the ball to bounce back but which is on the other side of the split.

What this flag really tracks is if we *must* inject a new ball or we have a ball that will just simply come back. I decided to inject the new ball by calling onPull (it cannot be onPush for obvious reasons) and not introducing a separate event just to track this case. This probably can be expressed in other ways, but the algorithm is correct to maintain 1-boundedness by introducing balls when necessary. 

The DetachedOp case is slightly different since there are two separate balls anyway, but hold can make a downstream ball "stick" to the dowstream wall. But since there is no upstream ball anymore to kick it out, I need to introduce an event again.