Cleanup row access functions in Frame

This reverts the API change accidentally caused by (dac7a76753c821ba6e7714a98e19ea466a9e226d), but
uses the same idea to keep the row access faster. The checkin also makes the API more uniform and
adds documentation. The pattern is `[Try]GetRow[At]` where `Try` means return `OptionalValue` and
`At` means lookup by index rather than lookup by row key. I actually removed `TryGetRowAt` because
that does not seem to be that useful (caller should make sure that they give us valid index) - but
I would be happy to add it back.

The checkin adds unit tests that capture the currnet expected behavior.