Use applicative rather than liftM
Rethrow errors with the module name

Rather than constructing the full error message every time
Use Either over Error when failing
Check that specific data constructors do exist