GetTopLevelUnitContaining returns the Scope nested in the global scope
that contains the given Scope or Symbol.
Use "Get" rather than "Find" in the name because "Find" implies it might
not be found, which can't happen. Following that logic, rename
FindProgramUnitContaining to GetProgramUnitContaining and have it
also return a reference rather that a pointer.
Note that the use of "ProgramUnit" is slightly confusing. In the Fortran
standard, "program-unit" refers to what is called a "TopLevelUnit" here.
What we are calling a "ProgramUnit" (here and in ProgramTree) includes
internal subprograms while "TopLevelUnit" does not.
"top level unit" is self-defining and I like it. Can we avoid "program unit" altogether, though? (It can't be "subprogram", either.)