Automating the Verification of Distributed Systems