refactor: separate err and validation errors

Runtime errors and validation errors are completely different things, therefore manage them as data returned from the process, not errors in the process. This allows conforming to Node convention of returning err early. Also prevents process runtime errors leaking into the end user.