Fix Python 3.12 build issues in thrift Python (#3276)

- Add pyproject.toml with setuptools build requirement for PEP 517 compliance
- Replace distutils imports with setuptools equivalents
- Use setuptools error names directly (CompileError, ExecError, PlatformError)
- Fix macOS header collision with ntohll/htonll macros in endian.h
- Add a matrix of MacOS versions (macos-15-intel, macos-14, macos-15,
  macos-26)
- Add a matrix of non-EOL Python versions for testing
- Remove MSVC2015 from the test matrix (very old).
- Support MSVC2022, the latest in AppVeyor.
- Upgrade tornado, twisted, and zope.interface versions to the first
  that support Python 3.12.
- Try to make the test_socket, RunClientServer, and TestServer tests less flaky.

This fixes the ModuleNotFoundError: No module named 'distutils' error
when building thrift with Python 3.12+.
diff --git a/lib/py/test/test_socket.py b/lib/py/test/test_socket.py
index af09515..5e25f1a 100644
--- a/lib/py/test/test_socket.py
+++ b/lib/py/test/test_socket.py
@@ -18,6 +18,7 @@
 #
 
 import errno
+import time
 import unittest
 
 from test_sslsocket import ServerAcceptor
@@ -98,7 +99,11 @@
             acc.close()
 
             self.assertIsNotNone(sock.handle)
-            self.assertFalse(sock.isOpen())
+            # Give the kernel a moment to propagate FIN before asserting.
+            deadline = time.monotonic() + 0.5
+            while sock.isOpen() and time.monotonic() < deadline:
+                time.sleep(0.01)
+            self.assertFalse(sock.isOpen(), "socket still open after 0.5s")
             # after isOpen() returned False the socket should be closed (THRIFT-5813)
             self.assertIsNone(sock.handle)