Undocument some stuff that's actually meant to be private.
Add a debug message saying how many processes will be waited for upon an error.
Implement a more concurrent job scheduling algorithm.

Vertices in the graph are now labelled with a status that is either
:pending or :processing. We locate all vertices that have no outgoing
dependency edges and are marked as :pending. We then enqueue all of
those with the coordinator process and set their status to :processing.
We then wait for an :exmake_done message to arrive (which job it is
doesn't matter) and remove the corresponding vertex from the graph.
Repeat until the graph is completely empty (no vertices at all).

This does mean that we'll do some excessive passes over the graph on
every :exmake_done message, but in turn, the algorithm is greatly
simplified. In practice, the passes over the graph shouldn't matter
that much since actual job processing is done on separate processes.

Closes #4.