Thinking in Promises: Designing Systems for Cooperation