Start to split the tests by language feature rather than phase.

Now that there's a testutil module it's easier to share the test utilities
between lots of different tests, so we can now switch from testing each
phase separately to testing each _feature_ separately, thus making the
tests more managable.

This change starts that by splitting out the if statement stuff into its
own module. Plenty still left to clean up, but this is a start.
Don't generate a union for a symbol that has no storages at all.

A symbol with no storages can't really happen in the normal course of
things anyway, but it can't hurt to be thorough.
Bool.c_type_spec should be a classmethod, not a property.
Give the DummyType a c_type_spec so it can be used in codegen testing.
Give the DummyAssignStmt an executed flag.

This makes it consistent with the other dummy statements.
Add a DummyDataDeclStmt alongside the DummyAssignStmt.

Both of these are handy for testing since they're less fiddly to use than
their AST counterparts that consist of several nested nodes.
Move the StatementBlock tests into their own test module.

Also adds some initial codegen testing, which was lacking before, and
makes the execution test use the shared dummy implementations rather
than defining its own.