Abstractions for Distributed Protocol Design