memory.lua: Optimize caching in virtual_to_physical().

The cache table is now indexed by huge page number (~ 2MB covered per cache entry) rather than base page number (4KB covered per cache entry).

This significantly reduces the profiler-reported time spent in address translation, but it's unclear whether this translates into an actual performance boost yet. We will have to determine this with benchmarking once we remove the guest VM as the bottleneck.