Add build dependency on config.mk.local

If config.mk.local is exists and is changed then we should rebuild on a
'make'
Split up atosl into multiple source files

atosl.c was getting a bit unruly, so the loading of subprogram data has
been moved into subprograms.c, with common.c holding functionality used
by both files.
Move uuid data into the context struct

Previously we just printed the uuid so we didn't make it globally
available, but this will allow upcoming diffs to use the uuid elsewhere.
Zero out context structure

Various parts of the program initialize this structure, we don't want to
accidentally use uninitialized data.
Use wrappers for _read and _write to check bytes

Ok, we need to stop being lazy and actually check to see if read and
write got all the bytes. This commit changes the read and write calls to
use wrappers that keep reading/writing until all of the bytes are
handled.

This alos means we can change all of the return value checks to just
seeing if they're < 0.
Add warning macro

Not every problem in the world is fatal, so add a warning for those
not-quite-right situations.
Add -c to cache symbol information to disk

By far we spend the most time parsing dwarf data. This commit adds a -c
option to cache data to disk or read it from disk, substantially
speeding up the program.

Note that we could still be smarter. If we stored the data in a btree,
for example, the lookups would be faster. But this is good enough for
now.