Fix #8: proper handling of PHONY targets

Tell the build system which targets are organizational
and should be run even if someone happens to create a
file with a matching name.
Fix #7: Genearlize the Recursive Build

Generalize the parallel recursive build mechanism so that the
implementation is a single block (not a single block for each
recursive target), driven by a list of targets that are recursive
and a list of subdirectories.

Exposes internal targets of the form "dir/target" so that the
build rules in any specific directory can indicate dependencies
between builds; for instance,

    test/cycle: lib/cycle

would indicate that the cycle target should not start building
in the test subdirectory until it finishes in lib. This is mainly
intended to support a dependency between two directories in the
directory list and a target they both implement. Using this to
do other clever things may result in undefined behavior of the
build system (it might work, but it might STOP working).

Also includes some additional build debug support added while
checking that this facility works.
Fix #6: Directory context in log messages

Modifies $P printed messages to include ${dir.rel} to identify
where they are coming from.

Modifies directory location varialbes for sources and targets
to use absolute path names.

Modifies the list of printf statements in debug targets.

Modifes "test coverage" facility to work with absolute paths.

Extra stuff: untabify tabs in makefiles that are not required to be tabs