Add `MThrow` and replace `MGuard`
The MR is the result of !488 (closed) and !501 (closed).
This adds the MThrow E M type class expresses the fact that the monad M allow error of type E to be thrown and any point with signature mthrow : E → M A. There is an alias MFail := MThrow unit and mfail := mthrow () for monads that can fail without any error payload like option.
This then replaces mguard with guard : P → {Decision P} → M P using mfail. The original guard notation disappears.
As such we've replaced guard P; mx with guard P;; mx in all lemmas. This MR further more replaces case_option_guard with a more general case_guard.
It also adds guard_or : E → P → {Decision P} → M P that throws an E instead of unit if P is false. Technically guard is just a notation for guard_or () like mfail and MFail.
These changes are very much breaking changes.
This is joint work with @adamAndMath.