error: A big overhaul
error: A big overhaul

Error gets more matching goodness. There is no longer an unset state
and consequent internal checks for null in various places in Error.
When a "throwing" function is called, a raw pointer should be set by
the FFI call and then passed to Error::from_raw(), which is the only place
where the null check is made.

A generic type DomainError wraps Error to provide per-domain
enumerated codes, supplied by enums implementing trait Domain
that are to be generated from GIR error enum records. The
Code enum replaces Match to support known and unknown codes.
There is method into_domain() for a failable conversion from
Error into DomainError, and an impl of std::error::FromError
for going the other way around.

The std::fmt::Debug impls for both Error and DomainError format
them in all their GError glory. Known codes in DomainError are
formatted with human-readable names, courtesy of Domain.
Code names are also used in the std::error::Error impl to
provide a fallback description if the message does not parse
as UTF-8.

gi-rust/grust