derail 0.3.0

An alternative to `core::error::Error`.
Documentation
# Examples

Here is an example that shows some of `derail`'s functionality:

```rust
use std::{io, iter};

use derail::CoreCompat;
use derail_macros::Error;
use derail_report::{HeapFactory, multiline};

#[derive(Debug, Error)]
#[derail(type Details = ())]
enum ConfigError {
    #[derail(display("failed to parse configuration"))]
    Parse,

    #[derail(display("failed to validate configuration"))]
    Validate(#[derail(children)] Vec<ValidationError>),
}

#[derive(Debug, Error)]
#[derail(type Details = ())]
enum ValidationError {
    #[derail(display("{_0}"))]
    Simple(&'static str),

    #[derail(display("failed to read imported configuration file"))]
    Import(#[derail(child)] CoreCompat<io::Error>),
}

let error = ConfigError::Validate(vec![
    ValidationError::Simple("number out of bounds for option A"),
    ValidationError::Import(CoreCompat(io::ErrorKind::NotFound.into())),
    ValidationError::Simple("string not long enough for option B"),
]);

let actual = format!(
    "Errors:\n{}\n",
    multiline::<_, _, HeapFactory>(iter::once(&error)),
);

let expected = indoc::indoc! {"
    Errors:
    ╰─► failed to validate configuration
        ├─► number out of bounds for option A
        ├─► failed to read imported configuration file
        │   ╰─► entity not found
        ╰─► string not long enough for option B
"};

assert_eq!(expected, actual);
```