Refactor the code and refine tests

Improve the code quality by eliminate code duplication and create
functions which have single responsibility.

In the tests test only the needed statements and not more (e.g. in the
RetainsTheFirstLetter test check only the first character and do not
make it vulnerable to the rest of the encoded word).
Add feature "ASoundexEncoder.GeneratesMaximumThreeDigits"