This is a new version of #501 as a diff on #488. It generalizes MFail as MThrow for monads that have an error payload
MFail
MThrow