Exit cleanly if no valid engine is selected
Refactor Makefile for testbench app

Instead of compiling all files into one master executable, build the
individual engines as static libraries and then tie them together with
the testbench app into an executable. This allows each engine to be
built with separate flags (and config.h) files that don't interfere
with each other.

This doesn't do dependencies yet (but neither did the old Makefile).