5e50d0e1

Author: Michael Lynch <git@mtlynch.io>

Committer: Michael Lynch <mtlynch@noreply.codeberg.org>

Split convert package by abstraction level (#231)

The convert package mixed four altitudes: a storage abstraction, image
primitives, fs-to-storage transform pipelines, and ffmpeg primitives.
Separate them to match the layout the upload work (slice-3) builds on:

- mediastore: MediaWriter/LocalWriter/WriteFile plus a generic
  WriteConverted helper that consolidates the temp-file-and-write pipeline
  previously duplicated in convert and importers.
- images: pure image primitives (GenerateSquareThumbnail, ResizeToWidth).
- imagepipe: GenerateAndWriteSquareThumbnail/GenerateAndWriteResized,
  rebuilt on mediastore.WriteConverted + images primitives.
- convert: now only ffmpeg primitives (video, avif); stdlib-only imports.

Migrate all call sites (importers, the import-from-tinybeans main)
accordingly. s3.Writer needs no change since it satisfies the interface
implicitly.

This is the layout half of the slice-3 refactoring, applied to master in
isolation. The slice-3-only helpers that serve upload functionality
(mediastore.WriteProduced, images.Dimensions, images.Reencode) are
intentionally deferred to slice-3.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

Reviewed-on: https://codeberg.org/mtlynch/little-moments/pulls/231
configuredevShellbackendbackend-devcheck-bashcheck-frontendcheck-go-formattingcheck-go-test-packagescheck-trailing-newlinecheck-trailing-whitespacediagramdocker-imagee2e-testsgo-testsimport-from-tinybeanslint-sqllittle-momentslittle-moments-devx86_64-linux