Port some of EState to Rust
This ports quite a bit of EState to Rust, handling some of the compression work. I started by trying to avoid any calls from Rust to C but I ended up giving up on that when it was the block-sorting's turn.
I tried to make each commit straightforward to make the porting obvious. This does mean that there is quite a bit of Rust code that we might want to encapsulate more or move out of the EState
struct into higher-level functions, but I figured it was better if that happens once the code hits the mainline.
This might be too much code for a first PR, but I was on planes way too much and got bored.