* Main.hs contains some common code that could be refactored to here.
* liftB and liftB2 imply liftB[3..5] at least ought to exist.
Really, want something like Applicative. But apparently TypedBehavior
is not a Functor, and so cannot be Applicative. There might be some
way to use type classes to do arbitrary arity lifting. Take a look
at QuickCheck and printf for ideas. Also see
https://www.seas.upenn.edu/~sweirich/papers/aritygen
Alternative might be to wrap all of Copilot DSL's functions like (>)
with ones that operate on TypedBehavior and Event.
(Then rename TypedBehavior to Behavior and make everything produce
and consume that, rather than the underlying Stream?)
Alternativly, copilot could be improved, see
https://github.com/Copilot-Language/copilot/issues/56
https://github.com/Copilot-Language/copilot/issues/59
* using whenB with an input' makes the interpretation see
each value from the list, even when the whenB is supposed to prevent the
input' from having run, and the value should be whatever was input
previously. This may not be fixable w/o Copilot DSL support
for limiting when inputs happen, at least as far as what the interpreter
displays as values of the input goes. But, it should be fixable
as far as the value that is input, at least in theory, by ignoring
the input values that should not have been input. The Copilot
DSL code used to do that may increase the size of the C program
unncessarily though.