Instead of controlling all logic from the top-level Makefile, splitting
into directory-specific Makefiles allows for:
- Better separation of concerns
- Improved compatibility with POSIX make(1)
As a possible drawback, support for out-of-tree builds has been removed,
in favour of simplicity and POSIX compatibility.