chore(scenario): reduce duplication of Describe by Runner

Runner has a lot of boilerplate code to a) update current describe, and b) delegate calls to the current describe. Abstract these out with factories.

By doing so, we also prevent Runner from second-guessing Describe's implementation (eg. marking methods as `noop`), which breaks abstraction.