Better tests of diagnostics and reasons for failure

The diagnostics code blows up when $got is unparseable, and these tests
didn't catch that because they circumvented Test::Deep's normal means of
generating diagnostics.
$got may not be a DateTime if ->descend() failed early

For example, if a string fails to parse as RFC3339 in ->descend, the
value passed to ->renderGot is still the string.  Handle it gracefully.