Stack tracing

The general approach here is:

1. Walk the Haskell stack, collect return closure code pointers

2. Use DWARF information in our own executable (and libs) to find the
   machine code blocks these code pointers point to.

3. Traverse debug information to find associates Haskell code.

The big upside with this is that it doesn't require any sort of
instrumentation on the source code, and therefore has pretty much zero
run-time overhead. On the other hand, we have to rely on the return
closure identity actually providing some useful leads, which is far
from guaranteed. After all, GHC tries hard to not push any unneeded
stack frames, often accidentally stripping the stack of all references
to the crucial functions. Ironically, it seems to often help to
compile *with* optimization, as inlining often allows us to derive
more about where the code came from.

Note that most of the code for reifying the stack was shamelessly
stolen from Max Bolingbroke.