The goal here is to eventually replace some code in python-wrapper.swig with this code. This way it can be properly unit tested and we can easily deal with Python version differences.
the first set of patches will focus on just getting the classes in with unit tests to confirm they work, and then I will replace the code in python-wrapper.swig with this code.
Note that the implementation of ResolveName here differs from the implementation of ResolvePythonName in python-wrapper.swig. The two methods seem equivalent to me, with this one being more straightforward, generic, and efficient.