Introduced ExampleDescriptor for reporting

When reporting test progress, examples and example groups were being reported
to the reporter, which meant that indirectly the reporter got a reference to
the actual test functions, as well as setup/teardown.

This would also mean that attempts to make the test context for examples
generic would also force the test reporter to be generic on the context, which
is a bad dependency. No longer with this change.
Made the type of test context generic

Allows a more functional approach when writing tests, where setup functions
return modified a new test context value, instead of mutating state on an
existing context.