SI-6488 Interrupt i/o threads on process destroy

The previous fix uses Thread.stop, 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 test.

There was a recent ML thread on whether there is a judicious use of stop.

In this case, the process code owns the threads performing the reads, but also invoke arbitrary callbacks.

One could argue that the callbacks are arbitrary and this might be a Coursera exercise so use stop, or inversely, don't stop arbitrary callbacks; or stop if the thread is still alive after some period.