Add private APIs to get Python version before bootstrapping Python. ### Description

Add private APIs (module.\_py_version_{major,minor,micro}) to get the Python version before bootstrapping Python, and use it in Module.preRun to initialize filesystem.

### Checklists

- [x] Add / update tests

from pytest_pyodide import run_in_pyodide


@run_in_pyodide(packages=["test", "pydoc_data"], pytest_assert_rewrites=False)
def test_pydoc(selenium):
    from test import libregrtest  # type:ignore[attr-defined]

    name = "test_pydoc"

    ignore_tests = [
        "test_server",  # fork
        "test_synopsis_sourceless",  # expects __pycache__
        "test_mixed_case_module_names_are_lower_cased",  # incompatible with zipimport
        "test_importfile",  # incompatible with zipimport
    ]
    try:
        libregrtest.main([name], ignore_tests=ignore_tests, verbose=True, verbose3=True)
    except SystemExit as e:
        if e.code != 0:
            raise RuntimeError(f"Failed with code: {e.code}") from None

from pytest_pyodide import run_in_pyodide


@run_in_pyodide(packages=["test", "pydoc_data"], pytest_assert_rewrites=False)
def test_pydoc(selenium):
    from test import libregrtest  # type:ignore[attr-defined]

    name = "test_pydoc"

    ignore_tests = [
        "test_server",  # fork
        "test_synopsis_sourceless",  # expects __pycache__
        "test_mixed_case_module_names_are_lower_cased",  # incompatible with zipimport
        "test_importfile",  # incompatible with zipimport
    ]
    try:
        libregrtest.main([name], ignore_tests=ignore_tests, verbose=True, verbose3=True)
    except SystemExit as e:
        if e.code != 0:
            raise RuntimeError(f"Failed with code: {e.code}") from None
