day11: wire base image digest through build pipeline
When a profile has a pinned base_image_digest, it is now used:
- In build_hash: hash derived from digest, not tag name
- In Dockerfile generation: FROM debian@sha256:... instead of debian:bookworm
- Saved on disk alongside the base layer for future loads
- All callers (cmd_batch, cmd_build) pass profile digest through
The APIs are designed to be callable from ocaml-docs-ci:
- Profile.resolve_base_digest: query Docker registry (no pull)
- Base.build_hash ~digest: deterministic hash from digest
- Base.build ~digest: build with pinned image
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>