Migrated from a "fail on bad files" approach to a "ignore files we don't understand approach. We're trying to output enough information to let the user know what files are being used and which are ignored.

Also added logic to try to choose the "most senior" of multiple revisions of the same file.
Fixed bug properly generating the destination filename for the upload to S3.

Also refactored the "ingestion utilities" into a article directory class which knows for example how to build the right zip file.

Wrinkle publishing updates to the app from this new class. Created a publisher interface so we could inject that logging capability into the ArticleDirectory class.