Support Forgejo-to-Forgejo git mirroring without a Radicle side
RepoPair.Radicle becomes optional (*RadicleTarget); a pair can instead
set forgejo_mirror to mirror its default branch, fast-forward-only,
against a second Forgejo instance with no Radicle node involved at
all. Issues/patches sync stays Radicle-only for now (that logic is
written entirely in terms of a Radicle client) — validate() rejects
sync.issues/sync.patches on a forgejo_mirror pair.
New internal/sync/git_ff.go (GitSyncerFF) mirrors GitSyncer's
fast-forward/divergence logic between two Forgejo remotes ("a"/"b")
instead of "forgejo"/"rad". New Direction constants
ForgejoAToForgejoB/ForgejoBToForgejoA for its activity log entries.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KB7C5CeuMbQujqRtb4foki