Depending on the circumstances we visit variables in, we need to
be careful about when to destroy their temporaries and whether to
emit a Ret op at all or not.
We currently cannot generate bytecode for statements once we've decided
we want to generate bytecode for expressions. This is a problem for `StmtExpr`, which is
an expression that requires us to evaluate a statement.
Merge ByteCodeExprGen and ByteCodeStmtGen, so we don't do that distinction anymore. Rename them to Compiler at the same time.