Break up the stable pointer table
I see no obvious reason for the stable pointer table to be a single array. Indeed, that leads to all sorts of complications. It smells to me like the simplest thing would be to make it a chain of blocks, and make a
StablePtr# a real pointer to the relevant entry. No relocation ever!