Rather than allow addressing tasks either by working set ID or uuid,
with attendant performance issues, this moves the API for the working
set to a single struct that just serves as a 1-1 mapping of indexes to
UUIDs. It's up to the caller to use this information.
Universes are really an optimization of filtering tasks, so let's define
them there, and derive them from the set of conditions. This means that
complex filters might get missed and end up doing a full task scan, but
that's probably OK.
Note that this does not fix the working-set API issues (#108 and #123).