Resolves #3 - Rework architecture to allow for much more abstraction. Among other things this allows us to add new protocol implementations easily