Specialize indexing triangular matrices with BandIndex (#55644)
With this, certain indexing operations involving a `BandIndex` may be
evaluated as constants. This isn't used directly presently, but might
allow for more performant broadcasting in the future.
With this,
```julia
julia> n = 3; T = Tridiagonal(rand(n-1), rand(n), rand(n-1));
julia> @code_warntype ((T,j) -> UpperTriangular(T)[LinearAlgebra.BandIndex(2,j)])(T, 1)
MethodInstance for (::var"#17#18")(::Tridiagonal{Float64, Vector{Float64}}, ::Int64)
from (::var"#17#18")(T, j) @ Main REPL[12]:1
Arguments
#self#::Core.Const(var"#17#18"())
T::Tridiagonal{Float64, Vector{Float64}}
j::Int64
Body::Float64
1 ─ %1 = Main.UpperTriangular(T)::UpperTriangular{Float64, Tridiagonal{Float64, Vector{Float64}}}
│ %2 = LinearAlgebra.BandIndex::Core.Const(LinearAlgebra.BandIndex)
│ %3 = (%2)(2, j)::Core.PartialStruct(LinearAlgebra.BandIndex, Any[Core.Const(2), Int64])
│ %4 = Base.getindex(%1, %3)::Core.Const(0.0)
└── return %4
```
The indexing operation may be evaluated at compile-time, as the band
index is constant-propagated.