Use isolates and recursive functions to better simulate Reactor

The isolates serve as a client/server communication stand-in. The recursive function
ensures that Dart's internal reactor loop does not get in the way of a reactor loop
on top of it.