SI-6488 Interrupt i/o threads on process destroy

The previous fix uses Thread.stop to stop the threads which
drain outputs, but should do something orderly.

This commit interrupts the threads, which must check isInterrupted
before attempting further i/o.

Similarly, i/o handlers must preserve and communicate interrupted
status; see the comment in the test.

The modest goal of this fix is to ameliorate any stack traces
when the process is destroyed.  The threads are given two nudges
to die quietly: if the first nudge is missed because it occurs
after checking isInterrupted and before waiting on i/o, it is
likely that the second nudge will interrupt the i/o.  In any case,
the reading thread will suppress either the interruption or the
IOException cited in the ticket.

The test runs itself as a sample process with output.