added stack full and stack empty functions
The location of the stack is now algorithmic instead of being based on
the end of the kernel. To decide the location of the stack I search
for the first region of high memory, make sure I'm not looking at
memory used by the kernel, go to the next 4K aligned address (because
it seemed like a good idea), make sure I have enough size in the
region, and put my stack there.