First steps towards a Create New Project wizard

UI needs much work, of course, but functionality should work:

* Wizard can show which step of the process it is on
* Project code automatically created from project name
* Back and Forward buttons won't work until form validates
Merge branch 'feature/fileupload' of https://github.com/sillsdev/lfsite into feature/fileupload
Merge remote-tracking branch 'lf/master' into feature/fileupload
add lex project zip file upload
Add language selector modal to new project dialog

Selected language doesn't yet do anything, but eventually it will be the
primary language for the project (e.g., default for lexeme fields, etc.)

UI still needs much work, of course.
In language selector, sort common languages first

In the list of languages presented by the model, sort any languages with
2-letter codes before any languages with 3-letter codes. That way the
majority language of any given country is likely to be at the top of the
list, where it can be found more easily.
Fix up whitespace in projects app

Whitespace in bellows/apps/projects/ng-app.* was becoming inconsistent,
with mixed tabs and spaces. Fixed it to use spaces everywhere, consistent
with the rest of the code: 4-space indents for HTML, and 2-space indents
for Javascript.
update composer to include changes to web-php-utilities
Merge remote-tracking branch 'origin/master' into feature/fileupload
Bash scripts for managing archives

Since we have to deal with at least .zip and .7z, and .7z at least
requires shelling out via an exec() call since there's no PHP-native
library to handle the format, I wrote a shell script to handle all
common archive formats (.zip, .7z, .tar.gz, .rar, etc). That should
allow the PHP side of things to be quite simple.

Actually, I wrote two scripts, one to check the size the archive will
expand into, and one to actually uncompress the archive.
Parse .lift-ranges file format

This is code to parse the .lift-ranges file and convert it to a PHP
array (keyed by the range "id", e.g., "grammatical-info") for use in the
LIFT import process. The changes to LiftImport to make use of this code
will be in a separate commit.
Import .zip files with ranges

If .zip files uploaded include a .lift-ranges file, it will now be
imported alongside the .lift file. This commit contains only the
server-side code to implement this; the client-side code to allow the
user to provide a .zip file will be in a separate commit.
Shell script for starting webdriver-manager

Like the Windows batch script in the same directory, a shell script for
starting node_modules/protractor/bin/webdriver-manager would come in
handy. So here's a shell script for the convenience of Linux devs.
Have git ignore node_modules/.bin directory
Update composer.lock to new FileUtilities version
LIFT import: only parse existing .lift-ranges files

If the .lift-ranges file was not supplied, don't try to parse it.
Add listCode values to all option lists in lexicon
Use PHP for processing archive files, not shell

We still need to call out to a shell-based command for extracting .zip
and .7z files, but there's no longer a shell script involved; instead,
the shell command is built in PHP.
Delete shell scripts for archive handling

These scripts have been replaced by PHP-native code.
Update composer.lock to get new FileUtilities func