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

exports.handlers = {
  jsdocCommentFound: function (e) {
    // JsDoc cannot handle Typescript type guards. Replace them with "boolean"
    // for JsDoc. Without this output docs get messed up.
    e.comment = e.comment.replace(/\{\s*\w*\s*\bis\b\s*\w*\s*\}/g, "{boolean}");
    // Remove typedefs from file. JsDoc can't parse these. Docs are produced
    // correctly without this but JsDoc produces very very noisy error messages.
    e.comment = e.comment.replace(/@typedef[^*]*/g, "");
    // There's still a couple of JsDoc parse errors we could fix...
  },
};

exports.handlers = {
  jsdocCommentFound: function (e) {
    // JsDoc cannot handle Typescript type guards. Replace them with "boolean"
    // for JsDoc. Without this output docs get messed up.
    e.comment = e.comment.replace(/\{\s*\w*\s*\bis\b\s*\w*\s*\}/g, "{boolean}");
    // Remove typedefs from file. JsDoc can't parse these. Docs are produced
    // correctly without this but JsDoc produces very very noisy error messages.
    e.comment = e.comment.replace(/@typedef[^*]*/g, "");
    // There's still a couple of JsDoc parse errors we could fix...
  },
};
