Previously, the `Task` struct had lots of runtime related fields such as
- `enqueue_at`: When a task should be enqueued.
- `enqueued_at`: When a task has been enqueued.
- `start`: When a task was started.
- `end`: When a task finished.
- `result`: The outcome of a task.
The problem with these was that all of them only made sense when the
task was in a specific state.
E.g. `enqueue_at` was only necessary when a task was `Queued`,
`start` only made sense when a task was at least started, etc.
Whenever the state of a task changed, those invariants needed to be
enforced, which was prone to error as it was really easy to just forget
about something.
The new design moves all of those fields and moves them into the
`TaskStatus` enum as struct variants.
This made the code slightly more complex, but significantly more robust.
Have `pueue` set the permissions of the socket created. Previously, the
permissions where unspecified and (at least for me) defaulted to `755`.
As part of this change, the default settings are moving to `700` which
is more restricted than the previous default.
Signed-off-by: JP-Ellis <josh@jpellis.me>
Replace darwin-libproc use with libproc::processes::pids_by_type(),
which is cross-platform. This returns pids _other than the group leader_,
so adjust the expected counts in tests down by one.