Better failure handling

** incomplete - do not merge, just requesting comments **

This (in-progress) change attempts to encapsulate all possible failures in a Marquise operation and provide opportunities to recover. Changes:

  1. Converting all exceptions to ``Error``s so they can be caught even inside a pipe. This means we can simulate handling timeouts in the middle of a stream (e.g. for testing).

@fractalcat @christian-marie 
Is this a useful function to expose? Seems like interface creep when how to handle errors is really something the user of the package should be deciding.