Revert "Revert "Historically the recator has just called the "async" method of the runner and wheel clients, but this actually creates daemonized processes. In addition to creating a new daemonized process each event, the number of process it creates is unbounded, meaning that the reactor can easily use all available PIDs on a fairly busy master. In addition, there is no bound on the CPU that these are allowed to use (since they can create ALL the pids). This changes the reactor to create a threadpool for executing its master-side clients (runner/wheel). This threadpool has a configurable number of workers (max parallelism) and hwm (max queue size before dropping events).""

This reverts commit 8c7d66d6dc643bfbe4bd7c6e3b64b4630855df8a.
Fix for malformed SLS files crashing reactor

Before if you had a malformed SLS file you'd get something like:

```
Process Reactor-4:
Traceback (most recent call last):
  File "/usr/lib64/python2.6/multiprocessing/process.py", line 232, in _bootstrap
    self.run()
  File "/home/thjackso/src/salt-github/salt/utils/event.py", line 688, in run
    self.call_reactions(chunks)
  File "/home/thjackso/src/salt-github/salt/utils/event.py", line 674, in call_reactions
    self.wrap.run(chunk)
  File "/home/thjackso/src/salt-github/salt/utils/event.py", line 713, in run
    l_fun = getattr(self, low['state'])
TypeError: string indices must be integers, not str
[INFO    ] Process <class 'salt.utils.event.Reactor'> (7656) died with exit status None, restarting...
```

Now you get something like:
```
[ERROR   ] Unable to render reactions for event salt/job/20141204195047408340/new due to errors (['The type broken in runner is not formatted as a dictionary']) in one or more of the sls files (['/tmp/test.sls', '/tmp/test2.sls'])
```
Revert "Revert "Remove "fire_event" from AsyncClientMixin, since this was only added to remove infinite recusion in the reactor-- which is now not calling this API""

This reverts commit ba7f08d047afffc2b87950910cac0cdd48b76302.
Revert "Revert "Remove some un-used variables""

This reverts commit 82b5567c9248f345e2b388e3d238d51b7a0d9640.
Revert "Revert "Pylint cleanup for threadpool""

This reverts commit 32d01ee6c6bd4a7070be158c7188ede14cb34b60.
Add debug logging to threadpool targets
Clarify comment
Instantiate the threadpool *after* forking.
Mark the task as done as soon as you pull it.
Ff there is an exception while running the func, that doesn't mean we should keep trying
backport tests for process manager
Add some tests for ThreadPool
Pylint cleanup
The `gpgkeys` path should use `salt.syspaths` for proper  multi-platform support.

Fixes #18877
Minor rST formatting
Minor clarification to not pointing directly to formulas repos
Updated Formula Best Practices doc with several recommendations
Each line can have any number of optional parameters, we use the location of the seperator field to determine the location of the elements after it.
On remount, the remount option was ending up in the /etc/fstab.
Ensuring that it is removed from the options.
Some mount options end up in the superopts so we should look for them there too.
Change all state examples to use short-dec format for consistency

Closes #12419.

The command used to search the docs for state examples is below. This
generates a file in Vim's quickfix format that can be loaded with the -q
flag.

find . -type f \( -name '*.rst' -o -name '*.py' \) -print0
    | xargs -0 -P10 -n1 awk '
        BEGIN { RS=""; FS="\n" }
        { linenr = linect; linect += (NF + 1) }
        /^\s+[a-zA-Z0-9'\''_-]+:\n\s+[a-zA-Z0-9'\''_-]+:\n\s+- / {
            print FILENAME "|" linenr + 2 "|", $1
        }
    ' > ./salt-states.quickfix
Detect a Windows VM on OpenStack and populate the 'virtual' grain
Use lists instead of tuples in modules/zypper.py