09666cc719
TryBeginCloseIfExpired set _closeStarted when it reserved a session, so the sweep's own CloseAsync reported AlreadyClosed: true and CloseSessionCoreAsync skipped SessionClosed: lease-expired, faulted-reaped and detach-grace-expired closes never left the sessions.open gauge and under-counted sessions.closed. The reservation now writes Closing only; the first CloseAsync to take the close lock does the accounting exactly once.