Teach while loops to not hang forever with no-execute

Fixes #1543
Fix typo and tweak `set` docs

Move the docs for the `-n` flag to `set` out of the list of scopes.
Don't allow readonly/electric values to come in through the env

When initializing fish, ignore any inherited environment variables that
match any of the readonly or electric variable names.

This prevents really weird behavior when e.g. fish is launched with
COLUMNS already set to something. In that case, testing $COLUMNS within
fish behaves normally, but any subprocesses get the value that fish
itself had inherited.
Don't sanity_lose if INTERNAL_BLOCK_NODEs have a null argv

Fixes #1545
Rewrite env_exists() for better scope handling

env_exists() wasn't properly handling multiple scopes in some cases,
notably with readonly/electric variables. Rewrite it to operate in a
more straightforward fashion.
set: Don't treat toplevel scope the same as global

When using the `set` command with the -l flag, if we're at the top
level, create a temporary local scope. This makes query/assignment
behavior be consistent with the value-printing behavior.

This works by marking the current block as needing to pop the
environment if a local scope was pushed. I assume this is safe to do. I
also assume the current block is the right one to modify, rather than
trying to walk up the stack to the root.
Mark COLUMNS/LINES as electric vars

They're dynamically calculated, so they qualify. This also removes them
from the list of exported global variables, because they're actually not
exported.
set: Print an error when setting a special var in the wrong scope

When attempting to set a readonly or electric variable in the local or
universal scopes, print an appropriate error. Similarly, print an error
when setting an electric variable as exported. In most cases this is
simply a nicer error instead of the 'read-only' one, but for the 'umask'
variable it prevents `set -l umask 0023` from silently changing the
global value.
Add an optional mode to env_get_string()

The mode restricts the scope in which the variable is searched for.

Use this new restricted scope functionality in the `set` builtin. This
fixes `set -g` to not show local shadowing variable values, and also
allows for scoped erasing of slices.
set: Don't create empty var when erasing index

When using `set -e foo[1]` to erase an index, if the variable doesn't
already exist, return 1 instead of creating it as an empty variable.
Change how we separate toplevel and global scopes

Instead of introducing a new local scope at the point of `set`, merely
push a new local scope at the end of env_init(). This means we have a
single toplevel local scope across the lifetime of the fish process,
which means that

    set -l foo bar
    echo $foo

behaves as expected, without modifying the global environment.
Fix for crash in kill-whole-line

Fixes #1548
Merge branch 'fix_set_scopes' of github.com:kballard/fish-shell into kballard-fix_set_scopes
Turn the 'mode' parameter of environment variables into an enum
Makefile: just build key_reader with the same objs as fish
Fix segfault in status builtin
Fix documentation on variable scopes for `read`

The `read` docs incorrectly asserted that -g was the default for
variables. In actuality it behaves the same way that `set` does.
Teach `command` builtin a -p/--path flag

Give the `command` builtin a single flag, -p/--path, that causes it to
print the full path that would be executed for the given command.
Fix typo in documentation for `type` builtin
Fix `type` function to work better

Stop using getopt to parse flags. It's far more expensive than
necessary, and results in long flags not being parsed on OS X. This also
allows args starting with - after the options list to be properly
interpreted as a value to test.

Print the error message to stderr as is appropriate.

Use the new `command -p` functionality when the -a flag has not been
provided (`command` does not have any equivalent to the -a flag),
instead of using `which`. This is faster and also avoids any possible
disagreement between `which` and what fish thinks is valid.

Stop testing every path to see if it's executable, that test has already
been done by `which` or `command -p`.

The end result is `type -P ls` is roughly 250% faster, according to
profiling, on my OS X machine.