Only print timing information if no errors occur.
Create sub-DAGs for each target instead of the entire set of targets.

Since we process the DAG by computing leaf vertices and picking
them off in waves, a sequence like `exmake clean all` would do
the completely wrong thing since the DAG would contain vertices
from both `clean` and `all` which would be processed in an
intermixed fashion.