Return the combined span of two date intervals, or null when they are disjoint.
Uses Temporal.PlainDate.compare for comparison.
Overlapping intervals return their merged span.
Adjacent intervals (e.g. aEnd === bStart) share one instant and ARE merged.
Returns null if either interval is invalid (start > end).
Returns null on invalid input (wrong type, malformed strings).
Accepts GMT calendar-annotated PlainDate strings — E5 (issue #78). Since the result is a date value, all four arguments must carry the same calendar tag (or all be bare ISO); a mismatch returns null rather than guessing an output calendar (E5 decision of record D4). The output’s tag is re-derived from the merged span, never copied from an input.