fix: lazy ADE sessions and respect cache expiration on every read
open sessions only on a cache miss and close them at the end of the outermost useProject() scope; reconnect once on a session-invalid error inside sendRequest() instead of replaying the user callback; track the active project separately from the logical project to avoid redundant setProject calls; read the backing cache on every access so expiration and cross-instance invalidation are honored even on warm instances; skip cache writes and extend nothing when falling back to a stale entry.