MIRTH-3199, MIRTH-3200: Improved how dashboard/channel panel plugins (server/connection logs) are updated in the Administrator.

Before, _many_ requests (at times up to a dozen) were being made to the server on the event dispatch thread whenever the user did pretty much anything (like clicking anywhere in the dashboard table). Now, the plugins have an extra set of methods specifically for long-running requests or data retrieval (prepareData). The current methods (update) are still called on the event dispatch thread, but the new methods are always being called in a background thread first.

To facilitate this, two new classes were added: QueuingSwingWorker and QueuingSwingWorkerTask. The former extends SwingWorker, and mimics the synchronization/queuing that we were already doing for refreshing statuses/channels/alerts. Now that's all handled in the class itself. All the caller has to do is pass in a task and override the doInBackground() method, basically almost exactly what it was doing before. The new worker class keeps a static ConcurrentHashMap of worker states for each task type (e.g. "doRefreshStatuses", "doRefreshChannels", etc.). To ensure that only one worker for a task type is running at any given time, the constructor synchronizes on the worker state and only starts working if the current state is IDLE. Then in the done() method, after the task completes the worker will synchronize again, and reset the state back to IDLE. When a new worker is instantiated, queuing is enabled, and there's already a worker running, the state will be set to QUEUED instead. Then in done() if the state was previously QUEUED, a new worker will be instantiated and executed.

This new queuing mechanism was applied to refreshing statuses/channels/alerts, and also to the dashboard/channel panel plugins whenever they are updated. In the future this can also be applied elsewhere, basically any time a task might be called from two different threads and only one should execute at a time.

Also, a new invokePluginMethodAsync method was added to Client. The connection status log/column, server log, and advanced alerting plugins now use the asynchronous connection pool rather than the single synchronous connection. This should greatly improve performance on the dashboard, because requests for different plugins can occur at the same time on different connections.