cylc daemon performance boosting

This increases the performance of the daemon under heavy task load and when just waiting around.

There were a couple of notable bottlenecks:
 * calls to `task.is_cycling()` (done so often that the Python function overhead is an issue):
   * replaced by `task.is_cycling` boolean (and similar)
 * prerequisite checking, including getting the tags:
   * tag-getting is now done less often and stored
 * runahead time computation calls:
   * number of calls reduced - also see time comparison tests
 * `state_summary` calculation for each task:
   * most state_summary information now cached (where unchanging)
   * `ETC` computation is now done by the GUI
 * time string comparison tests, in particular where the string first had to be converted to a `ct` object:
   * decorated function now used to cache time string comparisons (this will be an
     even bigger optimisation once isodatetime is done)

The change also adds a `--profile` option to cylc run, which can be used to switch on CPU time and job queue profiling (maybe we could add more later).