Output synonym lists in analysis.synonyms instead of pairs
Handle empty strings collections

A new EnhancedAnnotatedSuffixArray gets introduced here. It is raised whenether
the input strings collection is empty. This prevents us from further errors
during AST/EASA construction.
Prevent the code from handling empty strings collections
Score calculation optimization in EASA

The optimization is done via copying the code from the _get_child_intervals()
method to _get_child_interval() and making it able to return just after
finding the child interval needed.
Keyphrases graph functionality and changed CLI interface

* The CLI interface has changed to support 2 types of tasks: keyphrases
  table/graph construction. Also, the CLI commands are now grouped by
  types (only the "keyword" command group as of now, but this could be
  potentially extended in the future). Sample commands:

    python -m east.main keyphrases table <keyphrases_file> <texts_dir>
    python -m east.main keyphrases graph <keyphrases_file> <texts_dir>

* Terminology: we now use "text" throughout the code instead of "publication"

* Keyphrases graph returns the graph according to the algorithm by
  Mirkin et al. (2012) as a simple python dictionary of form:

    {"A": ["B", "C"], "B": ["A"], "C": []}

* Added some handling for incorrect CLI commands