Major design changes in Output objects.

In this design, we address two major problems (see below) with our last
design of output framework objects.

1. Tag and Id objects intuitively looked as if they belong to the same
super type, but we couldn’t see this in the code.  Because of this,
client code got awkward and tangled, and we ended up with awkward
conversion constructors.

We solved the problem in this design by clearly outlining the common
behaviour of both Tag and Id objects.  We got stuck before because we
thought of common instance variables instead of common behavior. With
this design, we have an abstract class Id, with common behavior, and
sub-classes RowId and Tag.  This worked out well.

2. Our Row object was too large, primarily because we had a number of
constructors and special logic for building the object.  In addition,
Row had other methods as well for its business logic.  So Row got big
because it contained code for building itself as well as code for
business logic.

Now, we have moved object building code into a new RowBuilder object.
Initially, RowBuilder got big because of multiple constructors and
complex logic (the same logic we had in Row as well before) to
accommodate Id for row creation.  We limited constructors and used Id’s
help to create Row.  We made Row immutable.

We modified other objects to fit this design.