Simplify the version bump process. ### Description

Simplify the version bump process.

- Use substitution hook in docs to update CDN URL.
  - In `dev` or `prerelease` versions, it will point to `dev` url
  - In `stable` versions, it will point it `vX.Y.Z` url
- Introduce a version bump script `tools/bump_version.py`.


~- Use `bump2version` to bump Python versions (continuing from #2460)~
~- Use `npm version` to bump JS versions~
~- Update `run_docker` script to use latest deployed pre-built docker image when `--pre-built` option is specified.~

### Checklists

- [x] Add new / update outdated documentation

from pyodide_test_runner import run_in_pyodide


@run_in_pyodide(packages=["sqlalchemy"])
def test_sqlalchemy(selenium):
    from sqlalchemy import create_engine, text

    engine = create_engine("sqlite+pysqlite:///:memory:", future=True)
    with engine.connect() as conn:
        result = conn.execute(text("select 'hello world'"))
        assert result.all()[0] == ("hello world",)

        conn.execute(text("CREATE TABLE some_table (x int, y int)"))
        conn.execute(
            text("INSERT INTO some_table (x, y) VALUES (:x, :y)"),
            [{"x": 1, "y": 1}, {"x": 2, "y": 4}],
        )
        conn.commit()

        result = conn.execute(text("SELECT x, y FROM some_table")).all()
        assert len(result) == 2

        result = conn.execute(text("SELECT x, y FROM some_table WHERE x=2")).all()
        assert len(result) == 1
        assert result[0].y == 4

from pyodide_test_runner import run_in_pyodide


@run_in_pyodide(packages=["sqlalchemy"])
def test_sqlalchemy(selenium):
    from sqlalchemy import create_engine, text

    engine = create_engine("sqlite+pysqlite:///:memory:", future=True)
    with engine.connect() as conn:
        result = conn.execute(text("select 'hello world'"))
        assert result.all()[0] == ("hello world",)

        conn.execute(text("CREATE TABLE some_table (x int, y int)"))
        conn.execute(
            text("INSERT INTO some_table (x, y) VALUES (:x, :y)"),
            [{"x": 1, "y": 1}, {"x": 2, "y": 4}],
        )
        conn.commit()

        result = conn.execute(text("SELECT x, y FROM some_table")).all()
        assert len(result) == 2

        result = conn.execute(text("SELECT x, y FROM some_table WHERE x=2")).all()
        assert len(result) == 1
        assert result[0].y == 4
