(The benefit of throwing instead of calling a callback with an error is that throwing is way more abrupt, while callback errors are often mishandled by implementers)