Add a special case into infer_widths for CAT

It turns out that the CAT node breaks everything: not only does it
have source widths that can be different, but it has a destination
width that's _also_ different.  While I've currently got the width
inference code running alright, I'm going to have to make some major
changes in order to get this width information to propogate to
everyone else...
Hack around CAT width reporting

Essentially I've got a special method in here (node::with_cat_width)
that sets the output width of a CAT operation.  Unfortunately, you
can't know this from just looking at a single line of the Flo file
(which is kind of a pain).

This makes outwidth() report correctly for a CAT node, but note that
width() is silently wrong for one of the nodes.  If we have

  d = cat s0 s1

then outwid() reports the width of d and width() reports the width of
s1.  You'll have to manually determine the width of s0 (via
subtraction) yourself.
Actually make with_cat_width work

I stuck this in the wrong place: you only want to do a with_cat_width
in the remap phase (as the regular widths are overloaded in the first
phase).

This width inference code is a wreck... :(