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=["cloudpickle"])
def test_cloudpickle(selenium):
    import cloudpickle

    squared = lambda x: x**2
    pickled_lambda = cloudpickle.dumps(squared)

    import pickle

    new_squared = pickle.loads(pickled_lambda)
    assert new_squared(2) == 4

    CONSTANT = 42

    def my_function(data: int) -> int:
        return data + CONSTANT

    pickled_function = cloudpickle.dumps(my_function)
    depickled_function = pickle.loads(pickled_function)
    assert depickled_function(43) == 85

from pyodide_test_runner import run_in_pyodide


@run_in_pyodide(packages=["cloudpickle"])
def test_cloudpickle(selenium):
    import cloudpickle

    squared = lambda x: x**2
    pickled_lambda = cloudpickle.dumps(squared)

    import pickle

    new_squared = pickle.loads(pickled_lambda)
    assert new_squared(2) == 4

    CONSTANT = 42

    def my_function(data: int) -> int:
        return data + CONSTANT

    pickled_function = cloudpickle.dumps(my_function)
    depickled_function = pickle.loads(pickled_function)
    assert depickled_function(43) == 85
