Internalize "complete" channel management

There is no reason to make this a responsibility of the loop driving the
Executor state machine.