Thank you for the helpful (and quick!) review. I fixed the issues you caught, including rebasing to correct the contents of one commit and fixing .gitignore.
I filed DM-9273 for the technical debt in display_ds9's xpa wrapper. I also added xpa.py which imports lsst.pex.exceptions and the symbols defined in _xpa.cc. I chose not to add a displayLib.py because in this case only the xpa interface is wrapped and failure to import that suggests that 3rd party package xpa is missing or broken. So in this case I feel it is preferable for that one module to be self-contained.