Refactor to use streams in runner and elsewhere

This makes it a lot easier to write tests on the parsing that do not
depend on forking the executable

Basically each debugger now really just parses a stream of the
debuggers output and writes to it’s input