Idempotency in APIs: Building Operations That Are Safe to Retry