Simplify ExecutionModel.PerformClassLifecycle(...) by passing only the test class Type instead of the whole ClassExecution object.
Phase out irrelevant finally block from ExecuteCases.
Consolidate the execution of a single case from ExecuteCases' loop body into ExecutionModel.
Drop UncallableParameterizedCase, which attempted to provide an error message when no inputs were available for a parameterized test method.  This implementation was unnecessary because MethodInfo.Invoke already provides a useful message, and it was insufficient because you could still bypass it by yielding an empty object array from within a parameter generator.
Drop redundant tests from CaseTests that are already fully covered by AsyncCaseTests.
Drop redundant tests from CaseTests that are already fully covered by ParameterizedCaseTests.
Drop redundant tests from CaseTests that are already fully covered by BasicCaseTests.
Move case execution logic out of Case and into the Invoke behavior.
Consolidate convention-discovery code in Runner into a private nested class, ConventionDiscoverer.
Move ConventionDiscoverer to be a public instead of nested within Runner.
Rename DiscoveryModel to CaseDiscoverer.
Move convention and case discovery classes into their own namespace.
Rename Invoke to InvokeMethod.