Move oneshot to its own module, add dictionary cache

The dictionary cache is just to allow us to quickly see if a
word the user has entered is already in our dictionary so that
we can determine whether we need to guess at the pronunciation.