Why Distributed Systems Are Hard