Parser analysis and errors for labelled statements, break, continue, return

This pull request covers a couple of things:
1. Make sure break, continue, return statements are nested in the right control context
2. Keeping track of labels and making sure jump targets are correct.
3. Checking for duplicate labels

I've added a state machine to track labelled statements. It has a current label set for the labels being accumulated, as well as a stack for label sets of enclosing statements. It also tracks whether the enclosing labelled statements are iteration statements or not, because continue statements can only jump to iteration statements.
Comment that these are uninitialized because they are *usually* not used.

Consider making `functionBoundarySentinel` demand-driven in creation too.