close

fun close()

Stop relaying and release both inbound pumps. Idempotent.

innerPump goes with relayJob because the two are now the only producers of incoming: leaving the inner one running would keep draining inner.incoming into a queue nothing will ever pass on. (No in-tree caller invokes this; scope teardown is the ordinary path.)