A Plan k o a is a specification for a pure Machine, that reads inputs selected by k
with types based on i, writes values of type o, and has intermediate results of type a.
A Plan k o a can be used as a PlanT k o m a for any Monad m.
It is perhaps easier to think of Plan in its un-cps'ed form, which would look like:
data Plan k o a
= Done a
| Yield o (Plan k o a)
| forall z. Await (z -> Plan k o a) (k z) (Plan k o a)
| Fail