Implement new build system

The old build system was based on recursive make-calls,
while the new system uses recursive Makefiles that include
each other and use a compositional approach to construct
complete dependency trees between the different modules and
their interdependencies.

Due to all the files becoming one large Makefile, one can use
simple Makefile rules to extend system everywhere.

This refactoring also removes a large number of unused options
and tries to simplify some parts of the old build system and is
usually about 40% faster when building on multi-core machines.