Designing Multi-Agent Systems around a Programmable Communication Abstraction