feat: use catch on promises to handle exceptions inside then

Beyond the syntactic sugar, it will properly reject even if the success function (of a `then`) throws an uncaught exception.
Closes #233