Trait-based exception handling

After a detour through thinking about [first-class checked exceptions](https://github.com/glaebhoerl/rust-notes/blob/268266e8fbbbfd91098d3bea784098e918b42322/my_rfcs/Exceptions.txt), I've now circled back around and convinced myself that @aturon's [original idea](https://github.com/rust-lang/rfcs/pull/204) of an `?` operator for propagating exceptions is actually brilliant and the perfect middle path. But I also want `try`..`catch`.

[CLICKME](https://github.com/glaebhoerl/rfcs/blob/trait-based-exception-handling/active/0000-trait-based-exception-handling.md)
Can’t `e` just be an arbitrary refutable pattern here, and allow multiple `catch` arms? So the example below becomes this:

```rust
try {
    foo()?.bar()?
} catch Red(rex) {
    baz(rex)
} catch Blue(bex) {
    quux(bex)
}
```

That way you only need one type of `catch` block *and* there’s less rightward drift.