Refactor the register allocator
Refactor the register allocator

This commit refactors the register allocator so that some of its
crucial functions can be used with different classes of registers,
and not just the integer registers.  The main code affected is
the code that handles register spills.  Allocate and ensure are
mostly generic now.

markdryan/subtilis,markdryan/subtilis