Extent StreamerElement printing.

Add the information about whether a StreamerElement is
designed for writing.
Factor the collection of this information into a single
routine TStreamerElement::GetSequenceType to centralize
and normalize the generation of this string (instead of
being partially duplicated in 4 places).
(cherry picked from commit f078d99088b91993dab0418cea5292bdde2235e2)
Add proper support for writing in the presence of io rules.

In the case a read rule applies to the current StreamerInfo,
which is used for writing, there was no good StreamerElement
describing the location and means to write the data member
(unless there was a repating element).

Now, in this case we introduce yet another StreamerElement
and mark it as a 'Write' element.  We also ignore it in
the 'right' places and similarly ignore the caching and
artificial element when writing.

For example with writeTree.C in roottest/root/io/datamodelevolution/misc
we get:

StreamerInfo for class: MyClass, version=1, checksum=0x36b5f1f8
  MyClass@@1     @@alloc         offset=  0 type=1001
  TObject        BASE            offset=  0 type=66 Basic ROOT object
  TObjArray      fArray          offset= 24 type=61  (cached)
  TObjArray      fArray          offset=  0 type=61  (write)
  TObjArray      fArray          offset= 16 type=1000
  MyClass@@1     @@dealloc       offset=  0 type=1002
   i= 0, @@alloc         type=1001, offset=  0, len=1, method=0
   i= 1, TObject         type= 66, offset=  0, len=1, method=0
   i= 2, fArray          type= 61, offset= 24, len=1, method=0 [cached]
   i= 3, fArray          type= 61, offset=  0, len=1, method=0 [write]
   i= 4, fArray          type=1000, offset= 16, len=1, method=0
   i= 5, @@dealloc       type=1002, offset=  0, len=1, method=0
(cherry picked from commit c7e58492680c8ca779af4851555668619bc94f9e)
Fix fOffset calculation when encountering cached elements

Update the StreamerElement search in TBranchElement::InitializeOffsets
to always try to find a StreamerElement that points to one of the member
of the actual class.   This allows for properly finding the offset
of the local object within the outer object.  The previous version
was somtimes looking at 'cached' StreamerElement; however their local
offset are (often) different that the non-cached version and the
main offset is very often different.   The previous code was then
applying this offset to both the actions for the cached StreamerElement
and for the regular StreamerElement.  For the cached element the
two actions compensated each other.  For the regular element if
the local object had an object within the main object, this was
leading to the 'reading' of the local object overwriting content
in the main object.

Now the offset is calculated for the local object in regard
to the outer object using one the StreamerElement that points to
one of the member of the actual class *and* AddToOffset is
not applied to the cached object (since they are never part
of an outer object the offset is always zero).

This fixes ROOT-5437
(cherry picked from commit 4fe9faedfc78269b8e835c652ef4cedc74f7a650)