Problem: Kernel wrapper methods return Range views by value, but their iterators point to the Range object.
Saving an iterator from a temporary view, such as block.Transactions().begin(), leaves it pointing to the destroyed view, so later use has undefined behavior.
Fix: Make range iterators point to the underlying Kernel wrapper object and use the range's compile-time getter for element access.
Remove operator->, which returned elements by value and could not easily support arrow expressions.