run_cell returns an ExecutionResult instance

gh-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