Split functionality into two, distinct classes

One (Decoder) for decoding and one (Encoder) for encoding.

We should consider moving all the classes into a namespace, to we don't have namespace collisions with any other, potential gems. 
They shouldn't be shared with any potential child classes, imho, thus `protected`