Run handler inside a fresh request scope, then tear the scope down — the
setup/teardown pair wrapped around a handler, exactly as a FastAPI yield
dependency brackets the request. The handler resolves whatever it needs
through the scope; every dependency built during the call is released
(LIFO) once it returns, then the response is handed back.
A handler that raises is released the same way, and the error reaches the
teardowns before it is re-raised for the app's exception handlers to map:
cleanup that only ran on the happy path would leak exactly when it matters.