public void start() {
        synchronized (stateMonitor) {
            this.startTimeNanos = clock.monotonicNanoTime();
            if (progress.getIterator().isDone()) {
                log.log(Level.FINE, () -> sessionName + ": progress token indicates " +
                        "session is done before it could even start; no-op");
                return;
            }
            transitionTo(new StateDescription(State.WORKING));
            taskExecutor.submitTask(new SendCreateVisitorsTask(computeBoundedMessageTimeoutMillis(0)));
        }
    }
We also have to explicitly keep track of how many messages we are processing
locally, as these may be asynchronous. We cannot invoke the control handler's
onDone() method until we have drained all such messages.
documentapi/src/main/java/com/yahoo/documentapi/messagebus/MessageBusVisitorSession.java