Cleaning up the Makefile

I have cleaned up the Makefile using pattern matching.  For most object files, you can just specify `blah.o` as a dependency, and then `blah.cpp` will be compiled into an object with `blah.hpp` as an associated dependency.  You don't need the explicit entry for `blah.o`.  I have also used keywords so to remove the unnecessary duplication of input and output files (this is where bugs can creep in!).  This slims down the Makefile considerably.  I suspect many of the remaining entries for object files can actually also be removed, since most of the added compiler flags appear to be for linking, so are not relevant.