fix: emit hashtag facets so #tags are clickable
Posts carried only a #link facet for the homepage URL, so the
#WordGame / #JeuDeMots / #atproto hashtags rendered as inert text
rather than real Bluesky tags.
Add tagFacets() to produce app.bsky.richtext.facet#tag facets (one per
hashtag; byte range over "#tag", tag value without the "#") and merge
them with the link facet, sorted by byte offset. The leading-letter
rule keeps the puzzle number "#N" from being mistaken for a tag.
Regression tests cover tag byte offsets (including multibyte) and that
"#3" is not tagged.