extra/runner/run: [bug] do classification before `check_capture_hardware`

...because `check_capture_hardware` greps the 'faiure-reason' file which
is created by running classify. This caused `check_capture_hardware` to
fail if using a device that uses the `v4l2src` Gstreamer element.
extra/runner/report.py: extra-columns appear in the order they are written

Python dictionaries don't have a consistent order (like a list) and so
when iterating over different instances of otherwise identical dictionaries
you aren't guarenteed to access the dictionaries' keys in the same order.
See [1].

This commit changes report.py's Run.extra_columns attribute to use an
`OrderedDict`, instead of a `defaultdict`, which guarantees the order of
iteration over a dictionary's contents will always be the order they are
instantiated. This caused a complication because `defaultdict` was using
lists as the default value to contain all the values, so the dict would
look like:
{
  "column1": ["value1", "value2", "value3", ...]
  "column2": ["value1", "value2", "value3", ...]
}

An `OrderedDict` won't let you do that so easily, so instead I took the
line-joining functionality in the html templates and put it into the
assignment of the column values. The new dict looks like:
{
  "column1": "value1\nvalue2\nvalue3\n..."
  "column2": "value1\nvalue2\nvalue3\n..."
}

Is use `textwrap.wrap` [2] to word-wrap lines to a maximum of 30 characters
which the same length as the failure-reason and notes are limited to.

[1] http://www.laurentluce.com/posts/python-dictionary-implementation/
[2] http://docs.python.org/2/library/textwrap.html#module-textwrap