3.1.0
Previously, union wrapping during `type.clone` calls would be done in place of normal copy. Now it is done as a backup if a normal copy fails. This is more consistent with the documentation, and makes it much simpler to wrap nested unions. Also add an optional argument to `type.getName` to expose built-in type names (useful to implement an "optional" logical type for example).