Refactor the compiler with a smart Result object

This branch rewrites the compiler using a result carrying object that allows us to use statements as expressions, should we need to.

Also, this kills the hoister.
![](http://images.mnn.com/sites/default/files/main_oyster_1.jpg)

I don't merge this myself 'cause I have butterflies, but all tests pass and the branch is mostly bisectable.