Because it's more idiomatic, removes the need for `FixErr`, and it gives
useful chains of error causes. For example, where we use to print this:
> fix-stacks error: failed to read `inline-gcc`
We now print this:
> fix-stacks: error: failed to read `inline-gcc`
> fix-stacks: No such file or directory (os error 2)
This is a lot more complex than the Linux and Windows support. First, we
must handle fat binaries, which contain code for multiple architectures,
using the `symbolic_debuginfo::Archive` type. Second, we must consult
the binary's symbol table and then read debug info from the object files
and archive files mentioned. We use the `goblin` crate for this.
This is necessary for DMD, which puts file names and function names
within JSON strings.
For testing I had to add a new test binary with the awkward name of
`example"json`, which requires escaping of the '"' char.