Deserialize time in Status objects the same way as everywhere else

In other classes when initializing from a hash we allow time to be either a
string or a time object. This makes it work with both YAML and PSON. This
fixes this for Puppet::Resource::Status.
(main) refactor of Puppet::Configurer.retrieve_catalog

No functional change, but reorganize for readability,
and beef up the explanatory comment. Style side benefits:
* Write negative conditionals consistenly
  (as  "if !" -- was a mix of "if !" and "unless").
* Just one explicit return site.
* Keep line lengths < 80.