SMPP needs to have a pluggable codec class.

It is possible for MNOs to give us messages that are in an encoding that aren't in the [standard encodings](https://docs.python.org/2/library/codecs.html#standard-encodings) that Python ships with.

We have two options:

1. Register a new codec with the [codec registry](https://docs.python.org/2/library/codecs.html#codecs.register).
2. Create a pluggable codec class for SMPP that fallbacks to python's codec registry for things it knows about but provides hooks for providing other encodings.

We've chosen to go with option 2 because adding a codec to the registry introduces all sorts of potential code loading race conditions.


I noticed another issue here -- we call the same error handlers for both encoding and decoding, but I don't think that makes sense:
* For decoding, ``handle_replace_error`` needs to return ``u'?'``.
* For decoding and encoding, ``handle_strict_error`` should raise ``UnicodeDecodeError`` or ``UnicodeEncodeError`` as appropriate.