WIP: Final round of Python 3 fixes (requires #457 to be merged first)

@ChrisBeaumont - this will be rebased after #457 is merged.

The ``test_choose_save_session_ioerror`` test fails in Python 3, I think because of the mocking of the open function which doesn't work. I've skipped it for now because I think it's just a mocking issue, but let me know if you have ideas how to fix it.