Why State is the Hardest Thing in Software Design