Note that this breaks the attempt.php page; there are a lot of methods that are missing PHPdoc comment; there are probably now some unused methods that could be deleted; and there are a couple of places which could be handled a bit better.
But, overall, I think this way makes sense.
That bit of JavaScript from mod/quiz/attempt.php is needed in question preview too, so refactor a bit.
I was disappointed to find that the
$PAGE->requires->js_module('core_question_engine');
line was needed in quiz_get_js_module, but it seems to be.
Also change non-Moodle-y string "End test..." to "Finish attempt..."