only consider root values that are strings

We should treat 0/false the same way as null/undefined/NaN for the
`root` configuration which is prepended to module paths in a combo url.
remove unused `type` assignment
variable per line for better readability
reuse index variable instead of array variable
use a descriptive name for the sorted module array
keep `len` assignment local to the for-loop
remove unused variable assignments
use `comboBase` to store the comboBase

Now we don't need `comboSource`, `base`, and `j`, so we delete them.
move `comboSource` initialization to the top
use local module name over closure variable
use `comboMeta` to store combo metadata
check for inserted modules by module name
drop module early if it dne or has been inserted
remove `groupName` variable
merge first and second for-loops

The first loop clustered modules under the comboBase and the second loop
further clustered modules by type, as well as calculating some general
information about the combo url (e.g., combo separator and max url
length).
move encoding logic into one for-loop

Now we can finally pull this loop out into its own method.
move var declarations closer to their first uses

* Eliminated 1-char var names, except for `i`
* Removed the unused `resCombos` variable
[async-queue] Test the firing of the 'complete' event on stop() (failing), about #1341
[async-queue] fix the firing of the 'complete' event on stop(), fix #1341
{promise} Add static methods and their tests