mailpipe: replace `respond` callback with exceptions.
Now mailpipe sub-functions will raise Response or InvalidMessage when
they want to respond to the incoming email. This takes advantage of
Python's exception handling to avoid passing the `respond` callback
all over the place. It also allows us consolidate error message
construction in `_get_error_response`, which will lead to both simpler
program logic and more consistent response messages.
Other changes to make this cleaner:
* Renamed functions in pygrader.email:
_construct_email -> construct_email
construct_email -> construct_text_email
* Pulled _get_assignment out of submission.run.