Avoid mangling traceback ANSI formatting.

The use of `%s` formatting breaks the ANSI color and formatting IPython annotates the traceback with.  This change preserves the formatting, making it once again possible to easily view tracebacks raised by a notebook run by runipy.

I've also saved the traceback text and pass it as an argument to NotebookError, making it easier to communicate the nature of the error to the calling function.