This is basically a distillation of the stepping code that is in the reference and trepanning debuggers with some small additional code to run the callback hook.
The idea of adding set_trace_func in Rubinius was not just that I think set_trace_func should be there for compatibility with MRI/YARV/Pickaxe, but
also because stepping in Rubinius is a bit unique. "step over", "step out", and "step into" are handled largely outside of the kernel, in the Ruby
callback code.
Thanks to Evan Phoenix and Brian Ford for all the help and support in Rubinius for making this possible.