Robust STDIN pass-through to sub-process.

My previous attempt at preventing explosive thread growth didn't work because I couldn't reliably interrupt a .gets call.  The timeout in the thread did cause the thread to begin aborting, but  would still be blocked.  Starting multiple such threads meant any user input could end up being consumed by any one of those threads.  Moving towards a single thread for getting user input and communicating to a new pass-through thread via a Queue avoids those problems and allows us to stop the pass-through threads when they're no longer needed.