Add -Werror to the release configuration. Also add the release build as
a dependency of the make validate rule. The idea is that builds should
not pass validation if they have warnings but it shouldn't stop debug
builds during development from compiling while work is in progress.
Split most of the work off into make/base.mk and allow for easy wrappers
to be created around that that can build with different instrumentation
in their own build directory.
Create wrappers for the following:
- release build
- debug build
- afl++ fuzzing build
- static analysis with clang
- clang memory sanitizer
- clang address/undefined sanitizer