Adding rules for syllabification

The whole goal to this is for Pronounce to correctly split the syllables of each word. In the process I split out of a lot of domain objects to try for good OO practices.

I also made things far more complex and this pull request is a biggie. I don't know if it's a positive or a negative, but most of the files are completely new.

There should be complete test coverage as I've tried to be good and do TDD.

The part I'm most eager for feedback on is the use of metaprogramming for the phones. My rationale was that the items in `cmudict.0.7a.phones` are all Phones, but there can be multiple instances of each so conceptually they make sense to be classes. The Phone module is pretty complex though so suggestions to improve it would be great.