Tasks allocated by user code

(Most of) the `flt_run` functions now take in `flt_task` instances,
instead of the task function pointer and parameters; this means you must
now allocate `flt_task` instances directly.  This should simplify the
API a bit, since there won't be quite as many combinations of run
functions to define.

Note that the actual task constructor functions are defined as callbacks
inside of the `flt` execution context object.  This lets us squeeze out
a bit of performance by updating this callback function pointer, instead
of having to place lots of if statements inside of a single all-purpose
globally visible task constructor.
Task queues use doubly-linked lists

The task queues are all now implemented using doubly-linked lists,
instead of the previous singly-linked lists.  We'll need this when we
implement the work-stealing part of the scheduler, since it will need to
grab stuff from the back end of the queue.