Modify drivers to use temp mappings for user data

The keyboard and console drivers are modified to use copy_*_userspace()
and kmap_*() functions so that they no longer depend on user-space
memory being identity mapped in the kernel page tables.

In the case of the keyboard driver, the old buffering functionality is
removed.  This wasn't very useful, and greatly complicated the code.
The way the driver works now is to read into a buffer *only if there is
a read in progress* and then copy the buffer into user-space when it
fills up or the read completes.  This way the driver doesn't need to
hold on to a temporary mapping for the duration of a read.
Fix address-space issues in msg.c

Use copy_*_userspace() functions to read/write pid pointer.
Fix address-space issues in signal.c

The signalling code should now be fully usable in an environment where
each process has its own private address space.  This further
differentiated the code for handling user-mode and supervisor-mode
signalling, so the send_signal() function has again been split into
send_signal_user() and send_signal_super() functions.
Use virtual memory for stack

All kernel subsystems minus ioctl should work with virtual memory now.
ioctl is a little tricky since my implementation is intimitely tied-up
with the system's stdarg.h.  Fixing this will require modifying the
library wrapper to ensure that arguments begin at a known offset from
the stack pointer when the system call is made, and rolling my own
argument-fetching routines.

Additionally, the argument vector passed to sys_create() is copied
between address-spaces.  The current implementation of this is ugly,
inefficient and extremely limited (maximum of 32 arguments, each of max
length 128 bytes) and should be fixed ASAP.