Provider abstraction
Twilio and Guni are interchangeable at the campaign level. The pipeline calls channel.send() — it doesn't care which provider executes it. Adding a third provider in future requires only a new Channel implementation.
How it works: sms_provider field on the campaign record determines which provider is used — no code change required to switch.