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.

The reading thread will suppress either the interruption or the
IOException cited in the ticket.

Similarly, i/o handlers must preserve and communicate interrupted
status.

The modest goal of this fix is to ameliorate any stack traces
when the process is destroyed.

The test runs itself as a sample process with output.

Supersedes https://github.com/scala/scala/pull/2478 which was corrupted by history.

Review by @soc and @harrah, hurrah.