Simpler error handling

The synchronous, buffered interface should just throw, because that's
the simplest thing to do.

The streaming interface should just emit 'error' events.  Browserify can
then handle those as appropriate and decide what to output.