[ty] Narrow TypedDict.keys()/values()/items() return types
This change makes `TypedDict.keys()`, `values()`, and `items()` methods
return more precise types:
- `keys()` now returns `dict_keys[Literal["field1", "field2", ...], object]`
instead of `dict_keys[str, object]`
- `values()` now returns `dict_values[Literal[...], union_of_value_types]`
instead of `dict_values[str, object]`
- `items()` now returns `dict_items[Literal[...], union_of_value_types]`
instead of `dict_items[str, object]`
This allows users to iterate over TypedDict keys in a type-safe manner,
enabling sound mutation patterns like iterating over a copy of keys to
modify the underlying dict.
Fixes https://github.com/astral-sh/ty/issues/2703
https://claude.ai/code/session_01Dv6yPG84sSNAjR517SdTD5