Fix double expansions (`$$foo`)

Double expansions of variables had the following issues:

* `"$$foo"` threw an error no matter what the value of `$foo` was.
* `set -l foo ''; echo $$foo` threw an error because of the expansion of
  `$foo` to `''`.

With this change, double expansion always works properly. When
double-expanding a multi-valued variable, in a double-quoted string the
first word of the inner expansion is used for the outer expansion, and
outside of a quoted string every word is used for the double-expansion
in each of the arguments.

    > set -l foo bar baz
    > set -l bar one two
    > set -l baz three four
    > echo "$$foo"
    one two baz
    > echo $$foo
    one two three four
Parse slices even for empty variables

When a variable is parsed as being empty, parse out the slice and
validate the indexes anyway, behaving for slicing purposes as if the
variable had a single empty value.

Besides providing errors when expected, this also fixes the following:

    set -l foo
    echo "$foo[1]"

This used to print "[1]", now it properly prints nothing.
Highlight "$foo[1]" properly

Preserve the highlighting applied to the slice brackets when coloring
variables inside of double-quoted strings.
Fix highlighting of `"foo\"bar"`

The backslash-escape wasn't being properly caught by the highlighter.

Also remove the highlighting of `"\'"`, as `\'` is not a valid escape in
double-quotes, and add highlighting for a backslash-escaped newline.
Color `"$foo[1"` as an error

We can't color the whole argument as an error, since the tokenizer is
responsible for that and doesn't care abou this case, but we can color
the `$foo[` bit as an error.
Fix error span for invalid slice indexes

The span now properly points at the token that was invalid, rather than
the start of the slice.

Also fix the span for `()[1]` and `()[d]`, which were previously
reporting no source location at all.
Merge pull request #1630 from kballard/expand_variables_in_quoted_strings

Fix various expansions issues with variables
Don't suggest after | & or in comments

Fixes #1631
Clean up variable expansion, and properly handle embedded NULs
Make `commandline -P` actually work

`commandline --paging-mode` worked but the short flags list accidentally
omitted the documented `-P`.