Harden read path: validate author handle before resolver fetch
The public renderer took the `@author` segment straight from the URL and
used it as a fetch host, so a non-handle-shaped value (e.g.
`evil.com/.well-known/atproto-did`, `evil.com:8080`, `evil.com?x=y`) could
smuggle a path/port/query into the outbound request and turn the worker
into a GET request proxy to arbitrary public hosts.
- Add `isValidHandleOrDid()` to auth/config: accepts only a syntactic
handle or DID, rejecting URLs and anything with a path, port, query or
scheme (stricter than `isValidAccountInput`).
- Gate `resolveHandleToDid()` on it before any network call, so both
reader pages reject bad input (they already 404 on null). `safeFetch`
stays the internal-host backstop; this is the syntactic gate in front.
- Regression test asserts malicious input resolves to null with zero
fetches; DIDs pass through without a network call.
Also sanitise preview.astro's `set:html` (static input today) so every
raw-HTML sink uniformly goes through `sanitizeArticleHtml`.