> Rust lacks a uniform error type
Rust has practically one error, it's the Error trait. The things you've listed are some common ways to use it, but you're entirely fine with just Box<dyn Error> (which is basically what anyhow::Error is) and similar.
Surely you need an alternative to Box<dyn Error> for reporting memory allocation failures?!
Having many semantic options for error usage is functionally the same as having many error types, except worse.