This PR replaces the old pipe code used for interactive I/O with code that uses pseudoterminals.
Most of the changes are isolated and small -- the runner now sends Ctrl-D (EOF) instead of closing the write end of the pipe, and the frontend no longer echos the input sent to it (as the TTY does it for us).
This PR replaces the old pipe code used for interactive I/O with code that uses pseudoterminals. Most of the changes are isolated and small -- the runner now sends Ctrl-D (EOF) instead of closing the write end of the pipe, and the frontend no longer echos the input sent to it (as the TTY does it for us).
This is partial progress towards resolving #444.