Locked task queues

Each execution context (of which there is currently...one) has a local
list of tasks that are ready to be executed.  Eventually we're going to
implement work stealing, where execution contexts can grab tasks from
each other.  Once we have multiple threads trying to access the same
data structures, we'll need some kind of synchronization.  Let's start
with a basic spinlock.  Once we have something that works correctly, we
can try experimenting with other approaches.