Parse/validate ISBNs in Zig

Publish the API documentation, and move CI to Forgejo master

`zig build docs` has been building the documentation since b5588c2 and nothing was reading it. This adds the job that uploads it, to https://jeff.jcollie.page/isbn.zig/, and the README says so near the top where somebody arriving looks for it. It publishes only from main, so that a branch build cannot replace the site with a work in progress, and only after `test` has passed, so that it cannot document a tree that does not compile. --upload-dir is incremental, so a push that changed one doc comment uploads what changed rather than the whole 17 MB source tarball. Which meant choosing a forge. git-pages-cli authorizes with a forge token, and the pipeline had no way to hand it one: spindle can carry a secret, but the token this needs is the one Forgejo mints for a running job. So the Tangled pipeline goes and .forgejo/workflows/test.yaml takes its place, matching zig65, merle65 and zig-ftp. The steps are the same checks the pipeline ran -- reuse lint, zig fmt, both -Dsimd settings -- plus `zig build` and `zig build check`, which it did not have. The new host names throughout, per the move off ocj.page: jeff.jcollie.page for the site and jcollie.page for --server. Both resolve, and the server answers a --dry-run publish with "unauthorized" rather than a connection error, so the only thing between this and a live site is the token the job supplies. git-pages-cli joins the devshell, since the workflow runs everything through `nix develop` rather than carrying its own copy of anything. Every step in the new workflow was run locally through that shell. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NJz47vhFE5XcSQUDbfP1N3


+79 -33
4 changed files