Pformat can now handle non-integer lifetimes.

Pformat apparently used the old range() method to calculate the discount
factor for costs.  This does not work for non-integer lifetimes (hence
the earlier objective function update).  Fixed by copying the logic from
the objective function.
Minor refactor.

The columnar code now uses a slightly more general implementation of the
cell-length algorithm, and uses the Python format() function over the
the printf style formatting.  But basically, a NFC, that hopefully makes
its intent slightly clearer.
pformat: str -> repr

In terms of data correctness, str() uses up to 12 decimals of precision,
which perhaps reads nicer but does not produce round-trippable values.
That is,

    >>> float(str(x)) == x

is not guaranteed to always return True.  However,

    >>> float(repr(x)) == x

is guaranteed to always be True.

The few extra digits of precision are of vanishingly small increased
utility, but it's a correctness issue.

Note that if we ever get to Python 3.4+, this should be a non-issue.