Make AssertDeepEqual's diff nicer
Make AssertDeepEqual's diff nicer

When I was debugging the monotonic time thing, testutils.AssertDeepEqual
would give me output like:

Error:  Objects do not match:

  a:

  [<*>{r0 <nil> <nil> <nil>} <*>{r1 map[c1:map[n1:[<*>{r1 c1 n1 2017-10-11 12:27:49.08368732 +0000 UTC m=+2.097558519 id1 u1 m1} <*>{r1 c1 n1 2017-10-11 12:27:50.08368732 +0000 UTC m=+3.097558519 id3 u3 m3} <*>{r1 c1 n1 2017-10-11 12:27:51.08368732 +0000 UTC m=+4.097558519 id2 u2 m2}]] c2:map[n1:[<*>{r1 c2 n1 2017-10-11 12:27:49.08368732 +0000 UTC m=+2.097558519 id4 u4 m4}] n2:[<*>{r1 c2 n2 2017-10-11 12:27:49.08368732 +0000 UTC m=+2.097558519 id5 u5 m5}]]] map[n1:[<*>{r1 n1 2017-10-11 12:27:49.08368732 +0000 UTC m=+2.097558519 u1 false true m1} <*>{r1 n1 2017-10-11 12:27:50.08368732 +0000 UTC m=+3.097558519 u3 false false m3} <*>{r1 n1 2017-10-11 12:27:51.08368732 +0000 UTC m=+4.097558519 u2 true false m2}] n2:[<*>{r1 n2 2017-10-11 12:27:49.08368732 +0000 UTC m=+2.097558519 u4 true true m4}]] map[c1:[<*>{r1 c1 2017-10-11 12:27:49.08368732 +0000 UTC m=+2.097558519 u1 true m1} <*>{r1 c1 2017-10-11 12:27:50.08368732 +0000 UTC m=+3.097558519 u3 false m3} <*>{r1 c1 2017-10-11 12:27:51.08368732 +0000 UTC m=+4.097558519 u2 false m2}] c2:[<*>{r1 c2 2017-10-11 12:27:49.08368732 +0000 UTC m=+2.097558519 u4 true m4}]]} <*>{r2 map[c3:map[n3:[<*>{r2 c3 n3 2017-10-11 12:27:49.08368732 +0000 UTC m=+2.097558519 id6 u6 m6}]]] map[n3:[<*>{r2 n3 2017-10-11 12:27:49.08368732 +0000 UTC m=+2.097558519 u5 false true m5}]] map[c3:[<*>{r2 c3 2017-10-11 12:27:49.08368732 +0000 UTC m=+2.097558519 u5 true m5}]]}]

  b:

  [<*>{r0 <nil> <nil> <nil>} <*>{r1 map[c1:map[n1:[<*>{r1 c1 n1 2017-10-11 12:27:49.08368732 +0000 UTC id1 u1 m1} <*>{r1 c1 n1 2017-10-11 12:27:50.08368732 +0000 UTC id3 u3 m3} <*>{r1 c1 n1 2017-10-11 12:27:51.08368732 +0000 UTC id2 u2 m2}]] c2:map[n1:[<*>{r1 c2 n1 2017-10-11 12:27:49.08368732 +0000 UTC id4 u4 m4}] n2:[<*>{r1 c2 n2 2017-10-11 12:27:49.08368732 +0000 UTC id5 u5 m5}]]] map[n2:[<*>{r1 n2 2017-10-11 12:27:49.08368732 +0000 UTC u4 true true m4}] n1:[<*>{r1 n1 2017-10-11 12:27:49.08368732 +0000 UTC u1 false true m1} <*>{r1 n1 2017-10-11 12:27:50.08368732 +0000 UTC u3 false false m3} <*>{r1 n1 2017-10-11 12:27:51.08368732 +0000 UTC u2 true false m2}]] map[c1:[<*>{r1 c1 2017-10-11 12:27:49.08368732 +0000 UTC u1 true m1} <*>{r1 c1 2017-10-11 12:27:50.08368732 +0000 UTC u3 false m3} <*>{r1 c1 2017-10-11 12:27:51.08368732 +0000 UTC u2 false m2}] c2:[<*>{r1 c2 2017-10-11 12:27:49.08368732 +0000 UTC u4 true m4}]]} <*>{r2 map[c3:map[n3:[<*>{r2 c3 n3 2017-10-11 12:27:49.08368732 +0000 UTC id6 u6 m6}]]] map[n3:[<*>{r2 n3 2017-10-11 12:27:49.08368732 +0000 UTC u5 false true m5}]] map[c3:[<*>{r2 c3 2017-10-11 12:27:49.08368732 +0000 UTC u5 true m5}]]}]

Ugh, what a mess.  I much prefer how testify/assert.Equal displayed their output
but since we can't use that if we want to use the custom
DeepEqual written in https://skia-review.googlesource.com/c/buildbot/+/61282,
I decided to mimic what they did so we can have nicer, easier to read
output.

With this CL, the above error becomes something more manageable:

Error:  Not equal:
  expected: &db.Task{Attempt:0, Commits:[]string{"e", "f"}, Created:time.Time{wall:0xbe71eea08fff7854, ext:24290191, loc:(*time.Location)(0xd7cb60)}, DbModified:time.Time{wall:0xfff9ded, ext:63643924994, loc:(*time.Location)(0xd7cb60)}, Finished:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}, Id:"103e9187-b8e5-5e19-8be9-39fafb8ad8da", IsolatedOutput:"", MaxAttempts:0, ParentTaskIds:[]string(nil), Properties:map[string]string(nil), RetryOf:"", Started:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}, Status:"", SwarmingBotId:"", SwarmingTaskId:"swarmid", TaskKey:db.TaskKey{RepoState:db.RepoState{Patch:db.Patch{Issue:"", PatchRepo:"", Patchset:"", Server:""}, Repo:"go-on-now.git", Revision:"e"}, Name:"Test-Task", ForcedJobId:""}}

  actual: &db.Task{Attempt:0, Commits:[]string{"e", "f"}, Created:time.Time{wall:0xfff7854, ext:63643924994, loc:(*time.Location)(0xd7cb60)}, DbModified:time.Time{wall:0xfff9ded, ext:63643924994, loc:(*time.Location)(0xd7cb60)}, Finished:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}, Id:"103e9187-b8e5-5e19-8be9-39fafb8ad8da", IsolatedOutput:"", MaxAttempts:0, ParentTaskIds:[]string(nil), Properties:map[string]string(nil), RetryOf:"", Started:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}, Status:"", SwarmingBotId:"", SwarmingTaskId:"swarmid", TaskKey:db.TaskKey{RepoState:db.RepoState{Patch:db.Patch{Issue:"", PatchRepo:"", Patchset:"", Server:""}, Repo:"go-on-now.git", Revision:"e"}, Name:"Test-Task", ForcedJobId:""}}

  Diff:
  --- Expected
  +++ Actual
  @@ -6,3 +6,3 @@
    },
  - Created: (time.Time) 2017-10-18 08:03:14.268400724 -0400 EDT m=+0.024290191,
  + Created: (time.Time) 2017-10-18 08:03:14.268400724 -0400 EDT,
    Modified: (time.Time) 2017-10-18 08:03:15.315541245 -0400 EDT,

If that's still not enough, there is a superVerbose flag that a developer can
use while debugging.  The superVerbose mode uses spew.Sdump() which outputs something
like:  
([]*db.TaskComment) (len=3) {
 (*db.TaskComment)({
  Repo: (string) (len=2) "r1",
  Revision: (string) (len=2) "c1",
  Name: (string) (len=2) "n1",
  Timestamp: (time.Time) 2017-10-18 16:04:21.753549282 -0400 EDT,
  TaskId: (string) (len=3) "id1",
  User: (string) (len=2) "u1",
  Message: (string) (len=2) "m1"
 }),
 (*db.TaskComment)({
  Repo: (string) (len=2) "r1",
  Revision: (string) (len=2) "c1",
  Name: (string) (len=2) "n1",
  Timestamp: (time.Time) 2017-10-18 16:04:22.753549282 -0400 EDT,
  TaskId: (string) (len=3) "id3",
  User: (string) (len=2) "u3",
  Message: (string) (len=2) "m3"
 }),
 (*db.TaskComment)({
  Repo: (string) (len=2) "r1",
  Revision: (string) (len=2) "c1",
  Name: (string) (len=2) "n1",
  Timestamp: (time.Time) 2017-10-18 16:04:23.753549282 -0400 EDT,
  TaskId: (string) (len=3) "id2",
  User: (string) (len=2) "u2",
  Message: (string) (len=2) "m2"
 })
}

Bug: skia:
Change-Id: Ia8fa226b69ef3556a350f8e287f14d4b3c1b2fb6
Reviewed-on: https://skia-review.googlesource.com/61682
Commit-Queue: Kevin Lubick <7cdab2cfab351f23814786ba39716e90eed69047@google.com>
Reviewed-by: Ben Wagner <3ef7217be91069877d94f7907ce5479000772cd3@google.com>

google/skia-buildbot,google/skia-buildbot,google/skia-buildbot,google/skia-buildbot,google/skia-buildbot,google/skia-buildbot,google/skia-buildbot,google/skia-buildbot