Allow us to add temporaries when optimizing.

Some optimizations we wish to do will need an extra temporary register
to store something in. This patch enables us to have such registers.
It also provides an acquire/release model so we can re-use these
temporaries, minimizing the number we need to add.
Specialize unboxing of incoming object args.