Refactor code generator + insert compiler phases
First cut of HeapBackend + MemoryProfile implementations.

HeapBackend and MemoryProfile/MemoryDriver provide a simple in-memory
storage engine. They are mainly intended as a way to test the query
interpreter implementation and help with defining useful profile levels
and base implementations.

The main feature here is QueryInterpreter. It is still very limited in the
number of supported features but it's enough to run the first two test
cases (CountTest and AggregateTest) which have been converted from
JdbcProfile to RelationalProfile. The interpreter and the data structures
are not particularly optimised for performance. We should consider
implementing a compiler instead of optimising the interpreter in the
future.