Crate-wide error and Result.
We keep the error surface small: anything internal collapses into Error::Other, and external integrations (HTTP, JSON, IO) get dedicated variants so callers can match if they want to recover.
Error::Other