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 
Why is the indentation inconsistent here? The rest of the codebase uses four spaces.