Synchronous dispatcher — runs the full delivery pipeline in the calling process.
Pipeline per delivery:
- Terminal state guard — skip if already succeeded/suppressed/cancelled.
- Transition delivery to :dispatched (must succeed before adapter is called).
- Resolve adapter module from config.
- Call adapter.deliver/2.
- Classify outcome (dispatcher responsibility, not adapter's).
- Record attempt + transition to final status atomically.
Swap to Chimeway.Dispatch.Oban in Phase 3 via config:
config :chimeway, :dispatcher, Chimeway.Dispatch.Oban