come in two basic types. Data atoms like NumAtoms and
contain actual data. RefAtoms contain
a reference to an IndirectObject which contains another Atom.
Quite often you will want to resolve any RefAtoms and just
obtain the Atom within the final IndirectObject - you want the
final item of data rather than a reference to a piece of data.
This function takes an Atom. If it is a RefAtom it finds the
Atom to which it points. It keeps doing this until it finds and
returns the final data Atom in the chain.
This method may return null if null is passed in, if a RefAtom
cannot be resolved or if a circular dependency is detected.
The reason this function is a member of the IndirectObject is
because resolving RefAtoms requires access to the ObjectSoup. The ObjectSoup is
taken from the IndirectObject.