Assorted changes

- using GADT's to represent DFAState and NFAState
- added some new value constructors for special states in DFA; namely
  DFADeadState and DFAAcceptDeadState. By adding these the computeDFA
  function is able to exit the computation when a state is
  'un-escapeable' and thus the result is known at that time
- added a few functions that generate DFA's to test the computeDFA
  function

TODO:
- add extra parameters to the DFA value constructor so accepting states
  and all states can be accessed without traversing the DFA
- consider how to traverse the DFA backwards.
  Note: the value constructor for (DFAState a) is:
  DFAState :: (Enum a, Bounded a) => (a -> DFAState a) -> DFAState a
  But one restriction of (a -> DFAState a) is that it is a total
  function (because of the properties of a DFA, every state must have a
  state transition for even character in there alphabet). Thus to
  traverse backwards from the accepting states we could use the inverse
  of (a -> DFAState a) for the given state. The only issue is there is
  no simple way to compute this. Perhaps putting the inverse function as
  a extra parameter to the value constructor DFAState is the correct
  solution? See http://hackage.haskell.org/package/TypeCompose-0.6.4/docs/Data-Bijection.html

Signed-off-by: Collin J. Doering <rekahsoft@gmail.com>