Highlights from the changelog:
- Added: `Mesh.save`/`Mesh.load` now exports/imports `Mesh.subdomains` and
`Mesh.boundaries`
- Added: `asm` will now accept a list of bases, assemble the same form using
all of the bases and sum the result (useful for jump terms and mixed meshes, see Example 41)
- Added: `MeshTri1DG`, `MeshQuad1DG`, `MeshHex1DG`, `MeshLine1DG`; new mesh
types for describing meshes with a discontinuous topology, e.g., periodic
meshes (see Example 42)
- Added: `ElementTriSkeletonP0` and `ElementTriSkeletonP1` for defining
Lagrange multipliers on the skeleton mesh (see Example 40)
- Added: `TrilinearForm` for assembling a sparse 3-tensor, e.g., when dealing
with unknown material data
- Added: partial support for `MeshWedge1` and `ElementWedge1`, the lowest order
wedge mesh and element
- Added: `ElementTriP3`, cubic triangular Lagrange element
- Added: `ElementTriP4`, quartic triangular Lagrange element
- Added: `ElementTri15ParamPlate`, 15-parameter nonconforming triangular element for plates
- Added: `ElementTriBDM1`, the lowest order Brezzi-Douglas-Marini element
- Added: `Mesh.draw().show()` will now visualize any mesh interactively (requires [vedo](https://vedo.embl.es/))
- Added: Adaptive refinement for `MeshTet1`
- Fixed: `MappingIsoparametric` is now about 2x faster for large meshes thanks
to additional caching