Synthesis of Distributed Systems