Implement a comprehensive performance collection, processing, and logging
facility.

There are two broad classes of statistics:  Basic packet processing
information and Flow statistics.

Basic performance statistics include items such as event counts, packet
counts, stream counts, dropped packet counter, processor load, etc.  The
Flow statistics count flows between IP addresses.

The general data flow is:

1. Process the relevant information from each packet as it's being
   inspected.  Increment local counters.

2. At a configured interval, process the counters into the statistics.

3. At same processing interval, Log these statistics to a file.

4. Switch to another log file for the next cycle.

The type of statistics collection/processing/logging is controlled via
configuration.

perf_monitor is implemented as a network_inspector to give it access to the
per-packet processing mechanism.  It doesn't perform inspection in the
broad sense, but rather collects and logs information.

Statistics gathering is performed by the PerfTracker classes.
Each class acts a separate module for gathering the different forms of
statistics. The PerfTracker classes pass their data into one of formatter
classes, which in turn format the data for output to console or to disk.

Currently output formats are:

1. Human-readable text

2. CSV

3. JSON

==== File Layout

[options="header"]
|============================================================================
|Section     |Description
|File Header |File ID and schema for parsing. This appears once at the start.
|Records     |This is a stream of records. There may be an unlimited number.
|============================================================================

==== File Header

[options="header"]
|==========================================================================
|Field Name  |Size                |Description
|Magic       |4 bytes             |Format identifier. Only "FLTI" exists.
|Schema Size |4 bytes             |Size of the included schema.
|Schema      |(schema size) bytes |Schema for parsing records in this file.
|==========================================================================

==== Record

[options="header"]
|===========================================================================
|Field Name  |Size                |Description
|Timestamp   |8 bytes             |The time this record was written
|Record Size |4 bytes             |Size of the record to follow
|Record      |(record size) bytes |Binary record. Parse against file schema.
|===========================================================================
