Added a string database to program_state

This is to consolidate all the identifiers in a program instead of
having multiple separately allocated copies in different data structures
they all just point to a master copy in the database.  It also
simplifies memory management.
Changed expressions to a block allocator

This lets me use pointers directly again instead of passing
around indices.  I haven't even bothered to make a way to "free"
individual elements or keep any bookkeeping except whether a block
is full or not. This doesn't matter since all expressions
are around for the life of the program and everything is created
and then freed all at once.

If/when I create some sort of block allocator library (probably
on top of cvector like here) I'll think about solving the more
general and more complete case.
Added break and continue

I'll expand the test when I add for loops and switch statements
which are next on my list.