Fix gcdx and lcm with mixed signed/unsigned arguments (#59628)
Add `gcdx(a::Signed, b::Unsigned)` and `gcdx(a::Unsigned, b::Signed)`
methods to fix #58025:
```julia
julia> gcdx(UInt16(100), Int8(-101)) # pr
(0x0001, 0xffff, 0xffff)
julia> gcdx(UInt16(100), Int8(-101)) # master, incorrect result
(0x0005, 0xf855, 0x0003)
```
Also add the equivalent methods for `lcm` to fix the systematic
`InexactError` when one argument is a negative `Signed` and the other is
any `Unsigned`:
```julia
julia> lcm(UInt16(100), Int8(-101)) # pr
0x2774
julia> lcm(UInt16(100), Int8(-101)) # master, error
ERROR: InexactError: trunc(UInt16, -101)
Stacktrace:
[1] throw_inexacterror(func::Symbol, to::Type, val::Int8)
@ Core ./boot.jl:866
[2] check_sign_bit
@ ./boot.jl:872 [inlined]
[3] toUInt16
@ ./boot.jl:958 [inlined]
[4] UInt16
@ ./boot.jl:1011 [inlined]
[5] convert
@ ./number.jl:7 [inlined]
[6] _promote
@ ./promotion.jl:379 [inlined]
[7] promote
@ ./promotion.jl:404 [inlined]
[8] lcm(a::UInt16, b::Int8)
@ Base ./intfuncs.jl:152
[9] top-level scope
@ REPL[62]:1
```
Inspired by
https://github.com/JuliaLang/julia/pull/59487#issuecomment-3258209203.
The difference is that the solution proposed in this PR keeps the
current correct result type for inputs such as `(::Int16, ::UInt8)`.