Two crawler shutdown UX fixes:
- Handle::close now aborts its chromiumoxide driver task when another
Arc<Browser> outlives the shutdown call. The previous fallback dropped
the local Arc and awaited the driver, but the chromiumoxide handler
stream doesn't terminate on its own, so the shutdown future hung
indefinitely on Ctrl-C. Extracted into a generic close_or_abort helper
with regression tests covering both the unique-Arc and shared-Arc paths.
- main::main wraps daemon.shutdown() in a 5s timeout as a defense in
depth so any future wedge can't trap the process from exiting.
- Default RUST_LOG (and .env.example) silence
chromiumoxide::conn / chromiumoxide::handler, which spam ERROR on
every CDP event the bundled types don't model.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>