Package traversal

Packages Traversable or Foldable instances are not useful to Writer. When we do either of those operations, the result should be dependent on the other fields of the data.

Now a single `traversePackage` higher order function is exposed.

It also carries the depth of nested declarations.

This lets you write `Writers` like (Using the `Control.Monad.Writer.Strict` Writer):

```hs
writeMarkdown p = putStrLn $ intercalate "\n" $ execWriter $ (packageTraverse pkgName modName decl p :: Writer [String] ())

pkgName s = tell ["# " ++ s]
modName s = tell ["## " ++ s]

decl depth (DecLeaf doc (Identifier i) y) = do
    tell [replicate (3 + depth) '#' ++ " " ++ i]
    showDocBlock doc
decl depth (DecNode doc (Identifier i) y _) = do
    tell [replicate (3 + depth) '#' ++ " " ++ i]
    showDocBlock doc

showDocBlock (Just doc) = do
    let desc = description doc
        params = parameters doc
        ex = example doc
        res = result doc
    tell ["**Summary:** " ++ show (summary doc)]
    when (null desc)   $ tell ["**Description:** " ++ show desc]
    when (null params) $ tell ["**Parameters:** " ++ show params]
    when (isJust ex)   $ tell ["**Example:** " ++ show (fromJust ex)]
    when (isJust res)  $ tell ["**Result:** " ++ show (fromJust res)]
    tell [""]

showDocBlock Nothing = return ()
```