Delaying deserialization of view result row keys and values until explicitly requested has very little value. The deserializer is still required to deserialize the rows, it just does so onto a dynamic object such as a JToken. This is adding more heap allocations, and adding an extra step to convert that to a POCO when Value<T> or Key<T> is called later. It is also interfering with fallbacks for non-streaming deserializers, which need to deserialize the whole response in one shot.
Instead, we can use strongly-typed results of IViewRow<TKey, TValue> which allows the deserializer to create the POCO directly.
Note: This is a PoC change for consideration.