feat(pdftract-1g578): implement image-source dispatch for binarization selection
- Add ImageSource enum (PhysicalScan, DigitalOrigin, Jbig2)
- Add BinarizerKind enum (Sauvola, Otsu, Skip)
- Implement image_source_from_filters(): maps PDF filter chain to ImageSource
- Implement select_binarizer(): maps ImageSource to BinarizerKind
- Dispatch policy: DCTDecode → Sauvola, FlateDecode → Otsu, JBIG2 → Skip
- Unknown filter chains default to PhysicalScan (conservative)
- Pure functions, no I/O, fully unit-tested
Acceptance criteria:
- DCTDecode → Sauvola ✅
- FlateDecode → Otsu ✅
- JBIG2Decode → Skip ✅
- Unknown → PhysicalScan (default) ✅
- Pure dispatch, fully tested ✅
- Wired into preprocessing coordinator ✅