fix: stop task re-runs and pin sheet story URI
Two tightly-correlated bugs had the same root cause: SwiftUI was
re-firing the StoryViewer .task when the comment sheet presented,
triggering loadStoriesForCurrentAuthor → presentStories again. That
reset imageLoaded and restarted the timer, which caused:
- blur/spinner flash on the story image (thumb cache bug was back)
- timer resetting to 0 and auto-advancing while the sheet was open
- the sheet collapsing because currentStory briefly became nil during
a presentStories cycle, and the .sheet content reads `if let story =
currentStory` — empty content auto-dismisses
Fixes:
- hasLoadedInitialStories guard on .task so it only loads once per
StoryViewer instance, even if SwiftUI re-fires it
- sheetStoryUri @State pinned when a comment button is tapped, so the
sheet content uses a stable URI instead of re-reading currentStory
on every render
- openCommentSheet(focusInput:) helper consolidating the three button
call sites