Implement flexible target specification

See commit message.
The information could be preserved with something like:

```
let foo = try!(bar().map_err(|s| s.to_string()));
```