Design for hspp

First pass:
-----------
  * traverse the file,
      - processing #if's and #ifdef's
      - reading #include's and recursively doing this pass on them
      - leaving #line's behind
      - whilst taking account of #define's and #undef's
  * only needs to look at lines beginning with a #
  * should discard C-style comments?  (no)
  * DO NOT gather the #define's for macros - their sequence matters!

pass1 :: SymTab -> String -> String

Second pass:
------------
  * traverse the residual file,
      - keeping track of #define'd macros
      - expanding #define'd macros when an instance is encountered
  * needs a whitespace-preserving tokeniser with odd rules to
    cover e.g. token concatenation.  Within Haskell, quotation marks start
    strings, haskell comments are preserved.  Within a cpp directive,
    quotation marks do not start a string, and C-style comments are
    converted to whitespace.
  * Line continuation characters are tricky; probably should only
    be recognised within a macro definition, not in ordinary code.

pass2 :: SymTab -> String -> String
