Use best Gzip compression, don't write extra header fields
Make _get_parent_download() subroutine private because it is not being used in other places than MediaWords::DBI::Downloads::Store
* Rename + refactor download storage packages in MediaWords::DBI::Downloads::Store::* to more generic MediaWords::KeyValueStore::* packages which could be used by other parts of the code to store key-value data of their own (e.g. the CoreNLP annotator)
* Make newly created key-value store packages use an constructor argument which would determine the specific location that will be used to store instance data (e.g. MongoDB GridFS database name, PostgreSQL table name, Amazon S3 bucket, etc.)
* Rewrite configuration in mediawords.yml to support multiple MongoDB GridFS databases / Amazon S3 buckets for various kinds of data
* Add a helper subroutine to MediaWords::Util::Config which would detect an old configuration syntax and die() while also suggesting the user to update configuration to an updated syntax
* Move get_data_content_dir(), get_download_path() and two helper subroutines from MediaWords::KeyValueStore (ex-MediaWords::DBI::Downloads::Store) to MediaWords::Util::Paths because they seem to belong there better
* Implement placeholder subroutines remove_content() and content_exists() in <...>::Remote, <...>::DatabaseInline, <...>::Tar key-value store packages to comply with the Moose-provided interface
* Implement remove_content() and content_exists() in <...>::LocalFile key-value store package
Add helper method MediaWords::Util::Web::response_error_is_client_side() which will determine whether LWP::UserAgent response errors were generated client-side
Fix typo (add semicolon); use same SQL comments as in the rest of the file because apgdiff sometimes refuses to process /* these comments */
Don't emit a warning when the "Client-Warning" HTTP header is undefined
Strip "content:" from the beginning of string only because the data might have substring "content:" somewhere inline
Remove mention of "downloads" in MediaWords::KeyValueStore::* storage packages because they are about to be used to store various kinds of data
* Add "AnnotateWithCoreNLP" Gearman worker which annotates "content" downloads with the CoreNLP annotator via REST, and then stores the results in MongoDB GridFS;
* Add "mediawords_enqueue_extracted_downloads_for_corenlp_on_gearman.pl" script which enqueues all "content" downloads to be annotated with CoreNLP.
Merge branch 'master' into corenlp_processing

Conflicts:
	script/mediawords.sql
	sql_migrations/mediawords-4441-4442.sql
Validate UTF-8 before submitting text to CoreNLP
Remove commented out "INSERT INTO processed_stories" statement because this work is being done by the "mediawords_update_processed_stories.pl" script for some time now
Update script's formatting, add some debugging messages
Index CoreNLP annotations in MongoDB by stories_id because they will be requested using the stories_id later on
Add a convenience method annotate_stories_id()
Rename _corenlp_annotate() to _annotate_text(), annotate_*() to store_annotation_for_*() for simplicity
Remove usage of downloads_id because annotations are about stories and story sentences
On error, print the error message too
Introduce helper methods _encode_json() and _decode_json() because JSON module uses various parameters and it's easier to have them in a single place
Add subroutines to fetch story's annotation, story sentence's annotation and annotation of a story and all of its sentences