[mlir] Always update ExtractValue to use last container in insert chain (#176588)
The current logic only updates the container operand to the last
`InsertValueOp` in a chain if we haven't switched to a nested insert
chain. Instead, keep track of the new container value and extract
position at all times, and always update if we have found a point higher
up in the chain to extract from.
This allows us to bypass more insertions (see the updated test) when we
are accessing nested struct members. It also allows us to move the
constant check back to the top, because we can just do it on a
successive call to fold.
Also added a test for a missing case (it is unchanged by this PR).