Resolves #186 and #210

This is a rather large edit because it required a lot of work to track back
to the source line where an opcode came from.  See the comments for
issue #186 for the majority of the explanation.

Issue #210 was solved along with this because the stack trace work I was
doing is what discovered problem #210.

This is STILL NOT well tested yet.  I wanted to get what I had in place so that others like @erendrake could pull the code and give it a try.

In the actual data of the list below, 3:000 is populated by the instruction pointer number.  It's only in the header labeling it that the formatting is trying to be applied to a string, which is why in the header I explicitly used 4 character strings (i.e. "IP  " (with two embedded spaces) instead of just "IP").  What I was going for was to ensure that the header matches the data even surviving future edits to this code, by using the same format string for both, but sadly I couldn't find a way to do that in Csharp's style of formatting (the same idea does work in C++ and Java style formatting, because the way they define format strings starts off saying "this is my total field width", and then go on to say "and if the thing is a number, here's how I want that width divvied up.  If it's not a number, then ignore this part…").