Generalize numext::fma for mixed scalar types

We should use FMA wherever appropriate, but we often don't to support mixed scalar types. See the discussion here: !1933 (merged)

We could generalize numext::fma(a, b, c) to support mixed scalar types. The default behavior would be to simply call a*b+c where a, b, and c are possibly different types. Or maybe the type of c should be the type produced by a*b. Regardless, if all types are the same, then we invoke the real fma implementation if it is available.

Thoughts @cantonios @ChipKerchner @rmlarsen1 ?

Edited by Charles Schlosser