A steptree is a node parented to a Block in a specific way.
A steptree is also parsed and written in a sequence that
differs from regular nodes.

Rather than being placed into one of the indices of its
parent, a steptree is placed into its STEPTREE attribute.
The STEPTREE attribute can have an alias name, but it is
internally stored as an objects attribute rather than a
list entry.

Parsers/serializers finish parsing the tree they are
currently in, then proceed to parse/serialize all steptrees
encountered in the order that they were encountered.

If a field detects it's a "steptree_root" it will pass around
a list in kwargs under the key "steptree_parents", which is
passed to the parser/serializer of each node within this node.
If one of these subnodes has a STEPTREE entry in its descriptor,
the subnode will be appended to kwargs["steptree_root"].

After all the parsers/serializers for all nodes within a Block
have been called, the parents list will be looped over by the
parser/serializer that built it and calls the parser/serializer
The "steptree_parents" item is removed from kwargs when kwargs is
passed to the parser/serializer to prevent infinite recursion.

This change of read/write order is for situations where
one may, for example, have an array of 4 Y structures
where each struct describes another array of 4 Z structures,
but the first array of 4 is stored contiguously, so the
serialized arrangement of the structures looks like this:
    [ AY, BY, CY, DY ],
    [ AZ1, AZ2, AZ3, AZ4 ], 
    [ BZ1, BZ2, BZ3, BZ4 ], 
    [ CZ1, CZ2, CZ3, CZ4 ], 
    [ DZ1, DZ2, DZ3, DZ4 ]
This occurs often, and having a single STEPTREE attribute
takes care of any number of structures that need to be
read/written in this order since you can use an array or
container of any size for the STEPTREE attribute.

-------------------------------------------------------------------------------