Introduce MonadThrow

We've been discussing this off-and-on for a while now. I think this subset of the changes we've discussed is pretty well isolated and defined. With this change in place, I would additionally be able to deprecate the failure and attempt packages, and move resourcet to use exceptions in place of its own homegrown MonadThrow.