This is the mirror image of #2170.

### Checklists

<!-- Note on checklists:
     If you think some of these steps are not necessary for your PR,
     just remove those checkboxes, or mark them as checked. Otherwise,
     if some checkboxes are left unmarked, we might assume that your PR
     is not ready to be merged and we might keep you waiting -->

- [x] Add a [CHANGELOG](https://github.com/pyodide/pyodide/blob/main/docs/project/changelog.md) entry
- [x] Add / update tests
- [x] Add new / update outdated documentation

Add `default_converter` argument to `to_js` and `toJs`. This is the mirror image of #2170.

### Checklists

<!-- Note on checklists:
     If you think some of these steps are not necessary for your PR,
     just remove those checkboxes, or mark them as checked. Otherwise,
     if some checkboxes are left unmarked, we might assume that your PR
     is not ready to be merged and we might keep you waiting -->

- [x] Add a [CHANGELOG](https://github.com/pyodide/pyodide/blob/main/docs/project/changelog.md) entry
- [x] Add / update tests
- [x] Add new / update outdated documentation

# setup: N=10
# run: julia(1., 1., N, 1.5, 10., 1e4)

# pythran export julia(float, float, int, float, float, float)
import numpy as np


def kernel(zr, zi, cr, ci, lim, cutoff):
    """Computes the number of iterations `n` such that
    |z_n| > `lim`, where `z_n = z_{n-1}**2 + c`.
    """
    count = 0
    while ((zr * zr + zi * zi) < (lim * lim)) and count < cutoff:
        zr, zi = zr * zr - zi * zi + cr, 2 * zr * zi + ci
        count += 1
    return count


def julia(cr, ci, N, bound=1.5, lim=1000.0, cutoff=1e6):
    """Pure Python calculation of the Julia set for a given `c`.  No NumPy
    array operations are used.
    """
    julia = np.empty((N, N), np.uint32)
    grid_x = np.linspace(-bound, bound, N)
    for i, x in enumerate(grid_x):
        for j, y in enumerate(grid_x):
            julia[i, j] = kernel(x, y, cr, ci, lim, cutoff)
    return julia

# setup: N=10
# run: julia(1., 1., N, 1.5, 10., 1e4)

# pythran export julia(float, float, int, float, float, float)
import numpy as np


def kernel(zr, zi, cr, ci, lim, cutoff):
    """Computes the number of iterations `n` such that
    |z_n| > `lim`, where `z_n = z_{n-1}**2 + c`.
    """
    count = 0
    while ((zr * zr + zi * zi) < (lim * lim)) and count < cutoff:
        zr, zi = zr * zr - zi * zi + cr, 2 * zr * zi + ci
        count += 1
    return count


def julia(cr, ci, N, bound=1.5, lim=1000.0, cutoff=1e6):
    """Pure Python calculation of the Julia set for a given `c`.  No NumPy
    array operations are used.
    """
    julia = np.empty((N, N), np.uint32)
    grid_x = np.linspace(-bound, bound, N)
    for i, x in enumerate(grid_x):
        for j, y in enumerate(grid_x):
            julia[i, j] = kernel(x, y, cr, ci, lim, cutoff)
    return julia
