Problem: the RPC startup catalog refresh also refreshes an expired OAuth
credential. When the process exited after the token request went out but
before the new token was written, the provider had already spent the
old refresh token and auth.json kept only it, so the next request failed
with invalid_grant.
RuntimeCredentials now tracks modifications whose update function has
started (a modification still waiting for the auth.json lock has sent
nothing). AgentSessionRuntime.dispose() waits up to 20 s for them, so
RPC, print, and interactive exits keep the rotated token.
closes#11692
Move provider auth and OAuth flows onto pi-ai Models, compose models.json and extension overlays through ModelRuntime, and retain ModelRegistry as an extension compatibility facade.