improve handling of exceptions in plugins

Exceptions generated when invoking a plugin's `collect()` method were being lost when `concurrent.futures.Future.result()` was invoked, since the caught exception would have a traceback relative to the parent thread, not the child.  So we store the original traceback on the exception within the child thread before re-raising, and then extract and display that traceback when the exception is finally caught by the parent.

We also now abort when the exception is found.

Finally, we watch out for errors from the github API.