Mark the unhash/hash functions static

Marking them static tells the compiler that those
functions will only be called from inside this file.
This means that it can make assumptions based on how
it is called - in this case, it recognizes that the arguments
to unhash are the same and bakes them in.  Since hash is inlined,
this allows it to unroll the loop in hash.  Finally, because of the
unrolling and argument baking, it can strip out some unnecessary
arithmetic and just subtract 7*37^(length) from the target.

Time is now .29 seconds.
Use a better internal representation of the strings

Now we use the position of the character instead of the character
itself.  This means that calculating the hash is way faster (no
memory lookups in lettersReversed) and incrementing a character
is faster (straight increment instead of a letters/lettersReversed
lookup).  When we've found the right answer, we do the conversion
to the right string (one lookup into letters per character).

We stopped generating lettersReversed since its not longer being
used.

This might be considered cheating, given our initial goal,
which is why I did it last.

Time is now 0.23 seconds.