Fixes #18 - Throw on complete failure instead of exiting the process

Using `throw` instead of `process.exit` so the user can wrap the failure and control the process themselves.