Refactor importer with tests

refs #4605

- Move as much code as possible out of the DB API
- Split the importer into 2 concepts, code which handles different
  filetypes and code which takes the content of files and imports it into
  Ghost in some way
- Split the import process into 4 steps, load the file into a useful
  format, preprocess the data, do the import, generate a report
- Reporting is currently a no-op
- Adds a basic level of testing
I know the way this is set up (finally returning a promise) has been this way forever but I don't think it's actually the behavior we want, so maybe we should just take the opportunity to clean it up?

Right now if `self.cleanUp(file)` rejects it's going to mask anything that happens above it (i.e., some other rejection).  Or if the promise chain above it resolves but `finally` rejects it's going to trigger a `.catch()` in the caller.

tl;dr we should probably set up `.finally()` to not return a promise (thereby just passing through the fulfillment value of the promise chain it's attached to.  If we need to handle errors on the `fs.unlink` we should catch them locally.