8d6f40ed

By: Michael Lynch <git@mtlynch.io>

Add typed StorageKey and ContentType wrappers for MediaWriter

Replace the bare string key and contentType parameters threaded through
the MediaWriter interface with typed wrappers, mirroring the existing
littlemoments.Filename pattern: each has a validating constructor that
rejects empty input plus a String() accessor.

The typed values propagate through every implementation and caller
(LocalWriter, s3.Writer, WriteConverted, imagepipe, importers, uploads,
s3config.FullPath, and the import command). Because the constructors
return errors, key-building call sites now surface those errors rather
than silently passing strings.

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

Suite timing

Time to Start Worker time Duration Time to finish
Config 1s 11s 11s 13s
Eval 11s 56s 56s 1m08s
Build 16s 8m16s 1m23s 1m39s
Test - - - -
Deploy - - - -
Suite 1s 9m24s 1m38s 1m39s

Timeline

0s10s20s30s40s50s1m1m10s1m20s1m30s