fix(errors): return errors via callback, don't throw