Build .d files in concert with .o files

Clang and GCC can build a .d file during an ordinary build.

This makes the build considerably faster and stops silly things like make attempting to update the dependency files when executing `make clean`

-MMD generates the dependency file for non-system headers.
-MP generates empty rules for headers in depends so the build doesn't break when a header is deleted or renamed.