WIP: Picklist editor, initial skeleton

No smarts here yet, just the barebones layout of what will eventually
become the picklist editor directive.
Import ngRepeatReorder.js directive (MIT license)

This is the unedited version of the ngRepeatReorder directive, as
retrieved from https://github.com/SimeonC/ngRepeatReorder on 2014-06-09.
Any modifications we make to this directive will go in separate commits.
Add dependencies of ngRepeatReorder.js

Also move ngRepeatReorder.js to a more appropriate location, where it
(and its dependencies) will automatically be included when the server
looks through the js/vendor folder.

I've included the complete license file for hammer.min.js because the
text of the MIT license says "The above copyright notice and this
permission notice shall be included in all copies or substantial
portions of the Software." Since the hammer.min.js file does not contain
the complete text of the MIT license per se, it's better to check in the
license text alongside hammer.min.js to be in complete compliance.

The angular-hammer.js file does not have an accompanying license file,
because none is included in its original Github repository. So we're
distributing precisely as much license text as the author included (the
"License: MIT" line in the file's header comment), which is enough given
that it's a well-known license, and that the original author believed
that this was enough license text.
Picklist editor WIP: use ngRepeatReorder directive

This isn't ready yet (much CSS tweaking remains), but dragging works.
Test new picklist editor (WIP)

Add section to project settings page (under the Project Setup tab) that
uses the new picklist editor with a list of programming languages. This
will allow tweaking the directive's CSS (and its HTML template) until it
looks good, at which point we can put the directive to actual use in the
real data (user profile settings like location, etc.).
Picklist editor WIP: Improve CSS

With <div>s and <input>s instead of <tr>s and <td>s, the resulting
picklist editor directive looks a lot better. There's a strange bug
that shows up if you remove the border from the ng-repeat-reorder-parent
element, though: the element being moved will appear to "jump" at the
top and bottom of the list. I believe this has to do with the interplay
of relative and absolute positioning in CSS: the moving element is
positioned absolutely, which means it's removed from the "flow" of
elements. If the parent div has no border, then when one of its children
is removed, it recalculates its vertical size -- but if it has a border,
then its size remains constant when one of its children is removed. This
results in very odd-looking behavior if the parent div has no border.
Picklist WIP: demonstrate no-border bug

Without a border around the .ng-repeat-reorder-parent element, the
moving element appears to "pop" into last position rather than moving
smoothly into place. The effect when it moves into first position is
even worse, though: when the "old" first element moves down because the
moving element is being dragged above it, the parent element suddenly
recalculates its vertical starting point to be the new top of the "old"
first element. And since the moving element is positioned relative to
the parent, the "top: 0px" CSS that *should* have allowed it to be at
the top of the list is suddenly making it overlay the "old" first
element. It's much easier to see this in action than to read a
description, so the Project Setup tab of any project settings page will
contain a demonstration of the new picklist editor with (as of this
commit) the bug. Move any element to the top of the list to see the bug.
Picklist WIP: remove bug from previous commit

The previous commit demonstrated the bug that happens when the parent
element has no border; this commit gives the parent element a border to
remove the bug. For aesthetic reasons, the border of the parent element
is the same size as the background it's standing against, so it will be
invisible to the user. But if the parent element doesn't have a 1-pixel
solid border, the bug shows up again and dragging elements isn't smooth.
Picklist WIP: Improve CSS a bit

Now the input fields will allow room for the buttons next to them, and
will also have just enough space between them to let the "glow" of a
selected input field be visible all around.
Picklist WIP: Add Save and Reset buttons

Rather than update the original list every time something changes,
we'll update it only when the user presses the "Save" button. We'll also
provide a "Reset" button to revert to the original values (or at least
the last time the user pressed "Save").
Picklist WIP: Add and remove items

The "new value" input box and the red X buttons work now.
Picklist WIP: Improve look of dragging operation
Picklist WIP: Improve user experience adding items

Now the user can press the Enter key in the "new value" input field to
add the new value. Also, when a new value is added (whether by pressing
Enter or by clicking the plus icon), the "new value" input field will be
reset to a blank value. Finally, blank values cannot be added, so if the
user presses Enter repeatedly, the new value will be added once and only
once, and no blank values will appear in the list.
Picklist WIP: Picklist can select default values

If the directive is passed a default-value="someBinding" attribute, it
will also keep that binding up-to-date with the default value selected
by the user in the appropriate dropdown.
Picklist WIP: Minor improvements (button wording)
Picklist WIP: demo on project settings page

Add watches to project settings page (logging to Javascript console when
values change) to test that both "picklistItems" and "defaultPicklistItem"
are being set correctly by the picklist's Save button.
Picklist WIP: <legend> element doesn't belong

The <legend> element with a name doesn't belong in the picklist
directive; it belongs in the client.
Picklist WIP: make ngRepeatReorder less verbose
Picklist WIP: stop ngRepeatReorder complaining

Occasionally, ngRepeatReorder can receive an undefined value, which
causes its isArrayLike() function to complain to the Javascript console.
That function already tests for null, so also test for undefined.
Picklist: Switch to key/value model in picklist

Instead of a picklist containing only values, the picklist directive can
now cope with either a set of objects with a "value" attribute (and
optionally a "key" attribute, which if it does not exist will be created
by substituting underscores for spaces in the value), or else with plain
values. So you can pass the picklist either an array of strings, or an
array of {key: "some_text", value: "some text"} objects. This change was
made because the project setup page needs key/value objects, so that the
list of choices can be localized into any target language while the key
names will stay the same.

Also, now that the picklist is working as designed, this commit puts it
into place in the project setup page.