web: port bluesky and contentMetadata Zustand slices master
Brings the full 6-slice store online in web: - lib/store/slices/blueskySlice.ts: the largest piece. Port of js/app/store/slices/blueskySlice.ts minus stream-key and go-live actions. Uses web's lib/oauth createOAuthClient, the local storage helper, and an inline clearQueryParams (the app's util short-circuits on native). - lib/store/slices/contentMetadataSlice.ts: direct port. Reads resolveDIDDocument / getPDSServiceEndpoint from a web-local copy of @streamplace/components/utils/did (that package is React-Native-coupled and not in web's deps). - lib/store/{index,hooks}.ts: combined store + selector hooks extended for the two new slices. - lib/did.ts: 49-line copy of components/src/utils/did.ts. Good candidate to move into @streamplace/core in a follow-up; the implementation is platform-agnostic. Excluded actions (TODO in slice comments): - createStreamKeyRecord + get/delete/clear: needs @atproto/crypto + viem. Phase 3 settings / Phase 4 go-live. - createLivestreamRecord + updateLivestreamRecord + golivePost + uploadThumbnail: needs RichText from @atproto/api (which web has) and the thumbnail upload helper. Phase 4 go-live. - createBlockRecord: no consumer in web yet, revisit if/when block UI is added. tsc clean, build clean (new code is tree-shaken since no consumer imports the slice yet), knip clean.