ENH: Large SGE jobs were overloading on qstat

When large jobs were run with SGE, the accumulation of
qstat queries was causing a massive load on the cluster
server, and was affecting overal system performance.

This modification queries based on userid, stores information
about all that users jobs (both running and recently finished),
subsequent queries are then addressed by looking at the cached
values first, then only updating with a system qstat call
periodically.  This change so that qstat is called on a
more reasonable replication time frame.

The qstat interval is set as a heuristic based on when
the last job succeeded and how many jobs the user has running.
Set a maximium qstat interval per task of 120 seconds.
Set a minimum qstat interval per task of 3 seconds.

\## One can use the multiprocessing.Pool() package to generate one
\## workflow per subject, but share the QstatSubstituion so that
\## queryies to qstat are throttled **AND SHARED** across all threads

import multiprocessing
manager = multiprocessing.Manager()
sharedJobDictionary=manager.dict()

persubjectWF.run(plugin=SGEFlavor,
                 plugin_args=dict(template=JOB_SCRIPT,
                                  qsub_args="-S /bin/bash -cwd -pe smp1 1-12 -l h_vmem=19G,mem_free=9G -o /dev/null -e /dev/null " + CLUSTER_QUEUE,
                                  refQstatSubstitute=QstatSubstitute(minRefresh=3,maxRefresh=120,dictionaryObject=sharedJobDictionary)
                                 )
                 )