This implementation relies on Open3.capture3 to run commands and capture results. In
contrast to the POSIX runner this cannot be used
in an asynchronous manner as-is; implementing that will probably mean
launching a thread and invoking capture3 in that thread.