Preserve non-concrete types in promote_typejoin (#37019)
It is useful to have `promote_typejoin(Union{Missing, Int}, Float64}` return
`Union{Missing, Real}` instead of `Any`, in particular because `zero` is defined
on the former but not on the latter. This allows `sum(skipmissing(::NamedTuple))`
to work even when it contains only missing values.
Fixes #35504, Closes #36939
Co-authored-by: Milan Bouchet-Valat <nalimilan@club.fr>