Unify case result types

There were two families of classes meant to represent the result of an individual test case: CaseResult (the leaves of a tree of all test results with a status property of Passed/Failed/Skipped), and PassResult/FailResult/SkipResult (passed to the Listener interface implemented by all test runners).  There was suspicious overlap between the CaseResult properties and those of the 3 more specific result types, but although they were meant to describe the same things they were beginning to diverge.  Also, CaseResults were always suspiciously constructed *from* the PassResult/FailResult/SkipResult objects.

This pull request unifies these types by converting CaseResult into an interface that the other three implement.