I realize these are all closely related, but when should you use these when developing an app? For example, it is easy to get a user's address, but when should you ask them for their key or key_hash, and is this something they need to explicitly provide?
The key_hash is just the address, which is derived from hashing the key. So if you have the key, you can easily generate the key_hash/address.
The reason you may want the key is because you need this to verify a signature signed by the private_key, which can be used in multiple ways within a dapp/smart contract (one example is a smart-contract based multi-sig wallet). You can't derive the key from a key_hash (as hashing is one way).
Some times though, public keys may be revealed so you can look these up at times using the manager endpoint.