PythonRunner implements CodeRunner

Also now uses exceptions to detect if the code ran okay rather than
using a boolean if it was successful or not.

Need to differentiate fatal exceptions and warning exceptions.