bpo-32030: Rework memory allocators (#4625)

* Fix _PyMem_SetupAllocators("debug"): always restore allocators to
  the defaults, rather than only caling _PyMem_SetupDebugHooks().
* Add _PyMem_SetDefaultAllocator() helper to set the "default"
  allocator.
* Add _PyMem_GetAllocatorsName(): get the name of the allocators
* main() now uses debug hooks on memory allocators if Py_DEBUG is
  defined, rather than calling directly malloc()
* Document default memory allocators in C API documentation
* _Py_InitializeCore() now fails with a fatal user error if
  PYTHONMALLOC value is an unknown memory allocator, instead of
  failing with a fatal internal error.
* Add new tests on the PYTHONMALLOC environment variable
* Add support.with_pymalloc()
* Add the _testcapi.WITH_PYMALLOC constant and expose it as
   support.with_pymalloc().
* sysconfig.get_config_var('WITH_PYMALLOC') doesn't work on Windows, so
   replace it with support.with_pymalloc().
* pythoninfo: add _testcapi collector for pymem
diff --git a/Programs/python.c b/Programs/python.c
index 707e38f..22d55bb 100644
--- a/Programs/python.c
+++ b/Programs/python.c
@@ -33,12 +33,9 @@
         exit(1);
     }
 
-    /* Force malloc() allocator to bootstrap Python */
-#ifdef Py_DEBUG
-    (void)_PyMem_SetupAllocators("malloc_debug");
-#  else
-    (void)_PyMem_SetupAllocators("malloc");
-#  endif
+    /* Force default allocator, to be able to release memory above
+       with a known allocator. */
+    _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, NULL);
 
     argv_copy = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*) * (argc+1));
     argv_copy2 = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*) * (argc+1));
@@ -98,13 +95,9 @@
 
     status = Py_Main(argc, argv_copy);
 
-    /* Force again malloc() allocator to release memory blocks allocated
-       before Py_Main() */
-#ifdef Py_DEBUG
-    (void)_PyMem_SetupAllocators("malloc_debug");
-#  else
-    (void)_PyMem_SetupAllocators("malloc");
-#  endif
+    /* Py_Main() can change PyMem_RawMalloc() allocator, so restore the default
+       to release memory blocks allocated before Py_Main() */
+    _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, NULL);
 
     for (i = 0; i < argc; i++) {
         PyMem_RawFree(argv_copy2[i]);