Option to use `Either` for catchable errors

Some errors can be handled at runtime by the downstream.  This pull request adds "safe" variants of many functions to expose type-safe error handling to users that want it.