run_cell returns an ExecutionResult instance

#7256 asked for a boolean return value from run_cell() for whether code ran successfully. I discussed this with Min, who suggested that given the complexity of run_cell, it should return a result object that can store different pieces of information about what happened.

This currently stores `execution_count`, `error_before_exec` (i.e. errors transforming, parsing or compiling the code), `error_in_exec` and `result`. It calculates `success` as a boolean that's true if neither of the error fields are set.

Closes gh-7256