Estimates handle cancellation gracefully

Pipeline no longer throws errors when estimates are canceled or deleted during generation.

Bug Fixes

Estimate generation now gracefully handles race conditions when estimates are canceled, re-generated, or cascade-deleted mid-pipeline. Previously, the pipeline would throw P2025 errors and mark the run as failed. Now it detects when the estimate row has vanished and cleanly completes the pipeline with a canceled status instead, giving users a better experience during rapid estimate workflows.