The framework looks good. Let's break it down to things we need:
1. Channels. arc0/arc.arc currently has "queue" which creates an abstract queue (currently implemented as a list). Possibly this is what we would like to use for channels, but note that queues will never block.
Alternatively we may have to reimplement this, since queues never block; arc0/arc.arc's 'atomic may give a hint on how to properly block on channels.
2. alt. To implement this we need to have access to something like select(), except necessary only on our channels. Basically, alt would extract the channel functions and determine which channels it should block on, and in which direction; our underlying channel-select code should then accept a list of channels and directions, and return which one it passes.