Machine: Jay's 64G desktop

ToProto:

WithPre:
      20	  95618541 ns/op	39861295 B/op	 1060078 allocs/op
      10	 123337381 ns/op	39863207 B/op	 1060098 allocs/op
      10	 123074097 ns/op	39860972 B/op	 1060079 allocs/op
      10	 124367722 ns/op	39861371 B/op	 1060075 allocs/op
      10	 123757496 ns/op	39861220 B/op	 1060065 allocs/op
      10	 122457428 ns/op	39860052 B/op	 1060058 allocs/op

WithPost:
      50	  26482329 ns/op	 7302381 B/op	   16378 allocs/op
      20	  76642407 ns/op	26233380 B/op	  375368 allocs/op
      10	 115666361 ns/op	44890162 B/op	  734396 allocs/op
      10	 145024249 ns/op	58154125 B/op	 1093554 allocs/op
      10	 182033826 ns/op	82205568 B/op	 1452403 allocs/op
       5	 211619219 ns/op	95290499 B/op	 1810701 allocs/op

ToJSON:

WithPre:
       5	 301938626 ns/op	159623070 B/op	 2381725 allocs/op
       5	 333503304 ns/op	159609675 B/op	 2381678 allocs/op
       5	 334535254 ns/op	159629153 B/op	 2381746 allocs/op
       5	 321055201 ns/op	159587396 B/op	 2381601 allocs/op
       5	 328103871 ns/op	159593441 B/op	 2381622 allocs/op
       5	 320395192 ns/op	159584097 B/op	 2381590 allocs/op
	
WithPost:
       5	 235309354 ns/op	127446713 B/op	 2091298 allocs/op
       5	 280120027 ns/op	157664113 B/op	 2299809 allocs/op
       5	 323651674 ns/op	187598216 B/op	 2508103 allocs/op
       3	 365435908 ns/op	212152914 B/op	 2716581 allocs/op
       3	 428802503 ns/op	247529517 B/op	 2924863 allocs/op
       3	 461889070 ns/op	271865712 B/op	 3132284 allocs/op

Down the rows, we vary the number of unique descendents from:
1, 1000, 2000, 3000, 4000, 5000

At 5000, there is no unique descendent. For PreTraverse, we expect the running
time to be constant. For PostTraverse, we expect to become faster when there
is more overlap, i.e., fewer unique descendents.

For ToProto, we see that WithPost might have a chance of beating WithPre when
there is a lot of overlap. However, when there is little overlap, WithPost
can be almost twice as slow and takes twice as much memory.

A similar story holds for ToJSON.

Yes, WithPost avoids a lot of work when there is a lot of overlap. BUT, note
that when we marshal the proto or JSON, we need to traverse every node.
Hence, the actual gain is not much. Considering this, we shall just go for
PreTraverse which is simpler and faster roughly half of the time.
