63d5dfe7

By: Michael Lynch <git@mtlynch.io>

Centralize media publication

Move media item construction, validation and processing coordination, and
metadata insertion into media.Service. HTTP handlers now parse requests, map
publication errors, and redirect; uploads.Processor accepts source paths and
writes the required variants.

The service preserves the files-before-metadata ordering, so a gallery item
never points at files that were not written. Its focused tests can assert that
orchestration without coupling to HTTP or the filesystem.

This is intentionally a publication-only stepping stone. It does not delete
files or add recovery behavior, so upload processing retains a write-only
storage dependency. Future work can extend the service with recoverable file
deletion and soft-delete recovery without adding DeleteFile to upload-facing
interfaces again.