Use pandas to find min success/max fail width_fac

Use the `pandas` Python package to find the:

  * Minimum successful channel-width
  * Maximum failed channel-width

for the routing of each placement.  This is demonstrated in the
`Routing results` IPython notebook.
[WIP] Add code/docs to find remaining routings...

Add code and documentation to the `Routing results` IPython notebook
describing how to find the remaining routings to be performed for all
channel-widths where:

  * At least one placement was routed successfully and at least one was
    not.
  * The channel-width is the minimum where all placements are
    successfully routed.

By performing all such routings, a great amount of flexibility is given
in regards to how the results are interpreted.  Since channel-width is a
fixed parameter for a target architecture, the minimum channel-width may
not always be the primary objective.  However, by recording information
about what channel-width is required for each placement, we can get an
idea of the "routability" of a placer relative to other placers.

The remaining routing tasks is given in the form of a list of
`(block_positions_sha1, width_fac)` pairs.
Add initial routing-summary script...

Usage:

    routing_results_summary.py [-h] routing_hdf_path net_file_namebase

    Display a summary of the routing results for a single net-file from
    a HDF results file

    positional arguments:
      routing_hdf_path
      net_file_namebase

    optional arguments:
      -h, --help         show this help message and exit
Use engineering notation for pandas output,...

Use engineering notation for pandas output to:

  * Avoid small float values being displayed as zero _(e.g.,
    critical-path-delay)_.
  * Make it easier to compare values at-a-glance _(e.g., `u` for micro,
    `n` for nano, etc.)_.

If no net-file namebase is provided, show results for all net-file
result groups found in the root of the HDF file.