Deferred shutdown work for a session that has already been removed from
the manager. finish() joins the session thread and clears any call
routes the thread registered while shutting down. Callers must release
the SessionManager lock before calling finish(). Joining under the lock
deadlocks: the dispatch thread needs the lock to drain the event channel,
and the joined thread can be parked on a full event channel send.