Implement _read. Figured out this heap business.

So, the heap is not strictly an extension of the data section of the
    executable, but rather some random section of memory between the end
    of the data section of the executable and the stack. Needless to
    say this confusion and the utter lack of resources for
    syscall-based memory management caused me quite a bit of trouble.
_freestr to free heap allocated strings and _reallocstr to allocate
    strings to larger buffers have been implemented. _allocstr was
    fixed.
Separated out heap initialization and the echo stuff which would
    otherwise just go in _start in test.s. The benefit of separating
    out the heap initialization is that I don't need to export the
    symbols used to manage the boundaries within the heap.

|| instructions |--| data |SIGSEGV------| heap |--...--| stack ||
Add list init, alloc and free.