add 'mprotect' to the list of always-needed symbols.

also reorder them to be alphabetical, this might get long...
add 'handler' test program.

so we can test the new mprotect stuff.
add some Cgo stuff for dealing with signals.

Go's syscall package doesn't use expose GET/SETSIGINFO, so we need
to make it ourself.
Revert "add some Cgo stuff for dealing with signals."

This reverts commit 5f38dc91be2feaaeb0a968a8645b85a5b85a896f.

We need to move that code into ptrace, because it must run from
the same thread that ptrace's the inferior.
debug: make SEGV handling exported.

so that we can actually handle it appropriately in main.
Implement access detection based on DSM ideas.

This is the 'meat' of the access detection scheme.  We change our
allocation routine ("tjfmalloc") so that it also mprotects the
memroy to be PROT_READ only.  Then we wait for a segfault: when it
happens, we check the list of allocations we know about, and it's
a segfault that we caused due to our mprotect'ing, we unprotect
it, clear the signal so the application never receives it, and
continue on.

In the future, we'll have to call "vis(...)" on the chunk of
memory that was accessed when this happens.  We'll also need to
recreate the read-only protection, so that we'll be informed of
subequent accesses as well.