Provide a decent toString() and override clone() covariantly.

DeepObject's equals(), hashCode() and toString() are a bit inconsistent.
DeepUtil stuff will check all fields, forcing inaccessible ones to be
accessible. toString() however uses StringUtil.fieldsToString(), which
only prints public fields. So it's easy to create a class like this that
compares equality based on fields not emitted in toString()!