fix: use getGalleryThread for story comments + simpler fav cache
The server doesn't implement social.grain.unspecced.getStoryThread —
verified via curl. But getGalleryThread already queries by subject URI
regardless of whether the subject is a gallery or a story, so the
client can use it for both. Switched StoryCommentsViewModel to call
getGalleryThread(gallery: storyUri) and deleted the orphaned
getStoryThread endpoint.
Simplified StoryFavoriteCache to a cleaner bool-oriented API
(isLiked/like/unlike). Key fix: isFavorited in StoryViewer now reads
from BOTH the story's viewer state AND the cache, so reopened stories
still show as liked even when the server returns no viewer state.
Also guards against nil response.uri on create so we don't accidentally
clear the cache entry on a successful request.