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

import pickle
from zoneinfo import ZoneInfo

from hypothesis import HealthCheck, settings, strategies


def is_picklable(x):
    try:
        pickle.dumps(x)
        return True
    except Exception:
        return False


def is_equal_to_self(x):
    try:
        return x == x
    except Exception:
        return False


# Generate an object of any type
any_strategy = (
    strategies.from_type(type)
    .flatmap(strategies.from_type)
    .filter(lambda x: not isinstance(x, ZoneInfo))
    .filter(is_picklable)
)

any_equal_to_self_strategy = any_strategy.filter(is_equal_to_self)

std_hypothesis_settings = settings(
    deadline=2000,
    suppress_health_check=[HealthCheck.function_scoped_fixture],
)


def is_picklable(x):
    try:
        pickle.dumps(x)
        return True
    except Exception:
        return False


strategy = (
    strategies.from_type(type)
    .flatmap(strategies.from_type)
    .filter(lambda x: not isinstance(x, ZoneInfo))
    .filter(is_picklable)
)

import pickle
from zoneinfo import ZoneInfo

from hypothesis import HealthCheck, settings, strategies


def is_picklable(x):
    try:
        pickle.dumps(x)
        return True
    except Exception:
        return False


def is_equal_to_self(x):
    try:
        return x == x
    except Exception:
        return False


# Generate an object of any type
any_strategy = (
    strategies.from_type(type)
    .flatmap(strategies.from_type)
    .filter(lambda x: not isinstance(x, ZoneInfo))
    .filter(is_picklable)
)

any_equal_to_self_strategy = any_strategy.filter(is_equal_to_self)

std_hypothesis_settings = settings(
    deadline=2000,
    suppress_health_check=[HealthCheck.function_scoped_fixture],
)


def is_picklable(x):
    try:
        pickle.dumps(x)
        return True
    except Exception:
        return False


strategy = (
    strategies.from_type(type)
    .flatmap(strategies.from_type)
    .filter(lambda x: not isinstance(x, ZoneInfo))
    .filter(is_picklable)
)
