Remove bulk tasks

I want to try focusing on getting the scheduler code fast enough that we
don't need bulk tasks to achieve high performance.  It's an experiment,
but my hypothesis is that it will simplify the scheduler enough that we
might be able to squeeze some more performance out of it.
Tasks can be singly- or doubly-linked

The internal task structure now contains fields for being either in a
doubly-linked list or a singly-linked list.  We need to have a
doubly-linked list for the ready queue of each execution context, since
we need to run from the front and steal from the back.  But for all of
the other cases where we need a list of tasks, the ordering of instances
in the list doesn't matter, and so a singly-linked list works just fine.
We can do this without using any additional space, and it's now
noticeably faster to allocate and free tasks via the context's unused
list.
Don't allocate tasks in batches

We no longer allocate tasks in batches, since we're going to assume the
rule of thumb that you don't allocate a huge number of task instances
all at once.  (We'll eventually provide higher-level APIs that let you
schedule a large number of tasks in a controlled way, with back
pressure.)

In addition to allocating each task instance singly, we now also make
sure that the new task instance is aligned to a cache line, to eliminate
one more possibility of false sharing.