LinearAlgebra: make matprod_dest public (#55537)
Currently, in a matrix multiplication `A * B`, we use `B` to construct
the destination. However, this may not produce the optimal destination
type, and is essentially single-dispatch. Letting packages specialize
`matprod_dest` would help us obtain the optimal type by dispatching on
both the arguments. This may significantly improve performance in the
matrix multiplication. As an example:
```julia
julia> using LinearAlgebra, FillArrays, SparseArrays
julia> F = Fill(3, 10, 10);
julia> s = sprand(10, 10, 0.1);
julia> @btime $F * $s;
15.225 μs (10 allocations: 4.14 KiB)
julia> typeof(F * s)
SparseMatrixCSC{Float64, Int64}
julia> nnz(F * s)
80
julia> VERSION
v"1.12.0-DEV.1074"
```
In this case, the destination is a sparse matrix with 80% of its
elements filled and being set one-by-one, which is terrible for
performance. Instead, if we specialize `matprod_dest` to return a dense
destination, we may obtain
```julia
julia> LinearAlgebra.matprod_dest(F::FillArrays.AbstractFill, S::SparseMatrixCSC, ::Type{T}) where {T} = Matrix{T}(undef, size(F,1), size(S,2))
julia> @btime $F * $s;
754.632 ns (2 allocations: 944 bytes)
julia> typeof(F * s)
Matrix{Float64}
```
Potentially, this may be improved further by specializing `mul!`, but
this is a 20x improvement just by choosing the right destination.
Since this is being made public, we may want to bikeshed on an
appropriate name for the function.