JIT: various register usage optimizations

1. If a register is going to be used later in the block, load it no matter what, even if the instruction doesn't bind it. Not always perfect, but seems to consistently shrink blocks. See the comment for why it's off for now for floats.

2. If a register is being moved to a destination register, and the destination isn't going to be used later in the block, just store directly to memory (avoiding a redundant move).