Add DiscordWebhookService for firehose virality webhooks
Builds the Discord embed payload (username, title, URL, description,
estimated likes / threshold fields) and POSTs it with a 3-attempt
exponential backoff. On final failure throws DiscordWebhookError so the
caller can decide whether to log or swallow it. Injects fetch and sleep
so unit tests run offline.
Also exports atUriToBskyAppUrl, the at:// -> bsky.app conversion helper.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>