feat(api): resolve profiles via bsky AppView with PDS fallback
Self-hosted PDSes (e.g. caramelo.social.br on Locaweb BR) silently drop
traffic from our Contabo VPS IP, so com.atproto.repo.getRecord against
the origin PDS always timed out in prod — corrupting avatar/displayName
for those users.
Add lib/bskyProfile.fetchBskyProfile: read avatar + displayName from the
Bluesky public AppView (public.api.bsky.app, globally reachable, returns
a ready-made avatar CDN URL) and only fall back to a direct PDS read when
the AppView lookup fails. Wire it into getProfile, GET /profile and
GET /users/:did, and stop hand-building CID-less avatar URLs.