New: macros.ts with MacroDef, parseBlockMacro, matchInlineMacro,
buildMacroTags, processInlineMacros.
Macro syntax:
@user — bare, no args
@user() — empty parens, same as bare
@npc(Goblin King) — self-closing with args
@style(box center — block: no closing paren on first line
Content here. — content on subsequent lines
) — closing paren on its own line
Unknown macro names now render as an error:
<span class="ribbit-error">Unknown macro: @bogus</span>
The verbatim keyword causes the contents to render as literals and also
preserves line breaks.