On Communicating Finite-State Machines