ditch the .then semigroup for the .fail/.or monoid