67ff5808

By: Michael Lynch <git@mtlynch.io>

Split tinybeans parsing into per-file functions with a higher-level assembler

ParseJournal, ParseFollowers, and ParseEntry each take an io.Reader and
parse a single JSON file independently. Parse(fs.FS) is now a thin
assembler that opens each file, calls the per-file parsers, resolves
MediaPath, and assembles the Export.

Tests call each parser directly with strings.NewReader so the test data
is a plain JSON string. TestParse uses a minimal fstest.MapFS focused
on MediaPath resolution and assembly correctness rather than re-testing
JSON field parsing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>