fail - a new error handling story

Contains three parts (only a sketch right now):

Example use case:

```rust

[macro_use] extern crate fail;

[macrouse] extern crate failderive; // haven't actually implemented this yet

[derive(Debug, Fail)]

[error_msg("something went wrong {}", self.message)]

struct CustomError { message: String, }

fn main() { use std::io;

let err = run_program();
match_err!(err => {
    io::Error:   err    => { println!("IO error: {}", err) }
    CustomError: err    => { println!("internal error: {}", err) }
    final:       _      => { panic!("should not have another kind of error") }
});

} ```