[ty] Normalize recursive TypedDicts during cycle recovery (#28918)
## Summary
We now avoid a cycle-iteration panic when a recursive functional
`TypedDict` is part of a shared or nested expression:
```python
from typing import TypedDict
Node = Alias = TypedDict("Node", {"child": "Node | None", "name": str})
```
Cycle recovery now normalizes class-based and synthesized `TypedDict`
types, including the fields and extra-item types stored on inline
definitions. The recursive part is approximated as `Divergent`, while
non-recursive fields and qualifiers remain available.