SSA preparation part 2

Some more changes from my SSA branch. The Reflect.compare change on the C++ target was made to avoid some weird Int type inference which comes from both `>` and `cast` being used.
I wasn't sure about this one. It comes from me working on expression-level DCE where I wanted to make the simple assumption that all block elements that do not have side-effects and are not the last block element can be removed. In that context it makes sense to consider a var declaration to _be_ a side effect.

Do you think this affects other part of the compiler? I could treat it as a special case in my DCE check.