refactor(api): Pydantic request models for plex routes + status unification (R6 S1b)
All 14 plex payload:dict endpoints typed (watch-link, collections, native
playlists, item/show/season state & progress). Shared PlexItemKeysIn (bulk add/
remove/reorder) and WatchedIn (show/season). item_progress's manual int()+400
becomes a 422 on a non-number.
Status-code unification (ROADMAP S1):
- the 5 collection write-failure 502s → 422, matching the house "external write
failed" convention (playlists' YouTube 422). The image/subtitle proxy-fetch 502s
stay (genuine gateway fetches).
- the field-validation 422s ("title is required", "title and item_rating_key are
required") → 400, matching every other module's required-field 400.
Ends S1b: no `payload: dict` remains in app/routes. Gate: ruff clean, pytest 164.