function respond(err, data) {
    if (err) {
      return callback(err, null, null)
    }

    return callback(null, trace._generatePayload(data), trace)
  }
The serializer is asynchronous, so serialization is as well.

The transaction trace sent to the collector is a nested set of arrays. The
outermost array has the following fields, in order:

0: start time of the trace, in milliseconds
1: duration, in milliseconds
2: the path, or root metric name
3: the URL (fragment) for this trace
4: an array of segment arrays, deflated and then base64 encoded
5: the guid for this transaction, used to correlate across
   transactions
6: reserved for future use, specified to be null for now
7: FIXME: RUM2 force persist flag

In addition, there is a "root node" (not the same as the first child, which
is a node with the special name ROOT and contents otherwise identical to the
top-level segment of the actual trace) with the following fields:

0: start time IN SECONDS
1: a dictionary containing request parameters
2: a dictionary containing custom parameters (currently not user-modifiable)
3: the transaction trace segments (including the aforementioned root node)
4: FIXME: a dictionary containing "parameter groups" with special information
   related to this trace

@param {Function} callback Called after serialization with either
                           an error (in the first parameter) or
                           the serialized transaction trace.