Picks the most efficient source shape available:
URL set → {"type":"url", "url":...}
DataBase64 set → {"type":"base64", "media_type":..., "data":...}
Path set → read file → base64 → {"type":"base64", ...}
MIME defaults to application/octet-stream when ImageBlock.MediaType is
empty (some servers accept that, some don't — operator's responsibility
to fill it in upstream).
File read failure → emits a "[image %q unavailable]" text block in its
place so the message still goes through with provenance preserved.
Verified live against Kimi K2.6 via Fabric channel: alice uploads
blue 32x32 PNG → Fabric plugin downloads + emits Media in inbound →
host turncore builds canonical.Message with ImageBlock → translator
reads file + base64s → Kimi responds "Blue".