A number of changes to memory management code

A number of minor-moderate changes to memory management code.  In
(rough) order of importance:

* Freed blocks are added to the head of the free list.  This drastically
  reduces fragmentation.
* mem_init() assumes there are 4MB of total memory, instead of the
  completely arbitrary amount it assumed before.  This was causing
  problems with the bochs configuration since it provides a machine with
  4MB of memory.
* kfree() and kmalloc() are implemented as inline functions (in
  kernel/mem.h) that call hfree() and hmalloc() respectively with the
  proper arguments.
* hmalloc() no longer checks for 0-length requests.  This responsibility
  is transfered to sys_malloc().  Kernel code is assumed never to
  request 0-length allocations.
* hmalloc() prevents 0-length blocks from being generated when a block
  is split.
* Various readability/maintainability improvements in mem.c.