Refactor blocks, programs and inverses

I've untangled the parsing of programs and inverses in blocks. This significantly reduces the amount of parsing logic that has been pushed into the AST Node constructors.

In order to simplify the grammar I've also added an `INVERSE` token which matches what `OPEN_INVERSE CLOSE` used to match.