Thinking like a compiler: places and values in Rust