Support retrieving a flattened set of symbols from a symbol table.

This introduces the concept of a "disconnected" child symbol table, which
is one that should not participate in flattening. The use-case for this
is cases where a child symbol table represents a separate execution
context like a function, where we expect the function to be able to reach
into the global scope but not for the locals to roll up into the global
scope.
Further ad-hoc progress on the preprocessor.

The basics of the preprocessor are now working, but a bit missing part
is the merge operation on the DataState class which is supposed to create
an entry data state based on the exit states of the predecessor blocks.
Currently this is not done and so the preprocessor's type analysis is
incorrect and incomplete.