Taming Chaos: Deterministic Simulation Testing for Distributed Systems