mm: sbrk allocates memory on heap increase

sbrk was peviously implementing a kind of lazy memory allocation
for the heap: A zero page was mapped to increase the heap
allocation. Whenever the application writes later to such a new
portion of the heap, the actual page allocation was done in the
trap handler (CoW-like).
Because of that, an application could even successfully malloc
more memory than available on the system (malloc never returned
ENOMEM). The system will later run out of memory when it handles
the trap.
This commit changes sbrk so that memory is allocated already
whenever the heap increases. malloc will return ENOMEM
whenever there is not sufficient memory left on the system.

Fixes #5.
mm: add getters to retrieve page usage state

This commit adds the following getter interfaces for
Mini-OS's memory management:

mm_total_pages():
 The number of pages assigned to the
 machine.
mm_reserved_pages():
 The number of pages that are not used
 by Mini-OS's memory management.
mm_free_pages():
 The number of pages that are still free
 and can be used for allocations.
mm_heap_pages():
 The number of pages that are allocated
 to the heap (only available when LIBC is
 enabled).
Merge pull request #7 from cnplab/skuenzer/memory-management

Memory allocation improvements