Explain the differences between synchronous and asynchronous communication, and when you would choose one over the other in a distributed system.