Adds Administrators during migrations

The migrations would add users with V/Flags/UserRole/Administrator to
the Administrator Group, and give users with V/Administer on
Q/Programs/* an Administer Permission on that program. However, they
would skip over users with V/Administer on Q.

This adds additional steps to the migrations, and does one of two things
to users with V/Administer on Q:

 - If enddate is sufficiently far away, the user is added to the
   Administrator group.
 - If the bit was set to expire, the user is given an Administer
   privilege on all programs, with the same expiration date.
Optimizes 0019_userrole

Makes the following optimizations:
 - Fetches the Groups from the DB once, rather than once per UserBit.
 - Performs inserts into the intermediate auth_user_groups table once
   per Group, rather than once per UserBit, by using the
   Group.user_set.add(*objs) method instead of the User.groups.add()
   method.
Fix typos in backwards part of user migrations

I noticed these when trying to run the migrations backwards in order to
test some changes Jordan made to them.
Update use of install_groups() and user role migration

These tweaks were necessary to get the code to run on my dev server:
namely, casting to a list on the line before using the unary * operator,
and also using an explicit default for the argument to install_groups().
Adds sibling_discount Tag & optimizes accounting

Optimizes the accounting controller by caching the sibling_discount
amount, and by caching the list of students that have sibling discounts.

Further optimizes the controller by skipping all calls to
execute_sibling_discount() if there is no sibling discount.
Optimizes accounting by avoiding subqueries
Limits accounting to registered students

Optimizes the accounting modules by limiting searches to students who
are registered for the program, rather than all students who have a
Transfer for that program.

In theory this should not change anything, but there exists some bug
that is creating Transfer objects for all users. This bug was crippling
the accounting module before this commit.
Merge pull request #701 from learning-unlimited/fix-groups

Fix groups
Moves memoized accounting properties to Program

The memoized properties weren't being very helpful in the accounting
controller, because they still needed to be computed once per
IndividualAccountingController. By moving these properties to the
Program model, these properties will only need to be computed once per
request.
Fixes typo in LITAdmin
Adds StudentSubjectInterest model
Adds sibling discount to program creation

Also makes some fixes to the program creation form template, and adds a
sibling discount setter to Program.
Fixes unicode formatting of SSIs
Add StudentSubjectInterest to admin interface
Merge branch 'create_student_subject_interest' of github.com:learning-unlimited/ESP-Website into create_student_subject_interest
Merge pull request #719 from learning-unlimited/create_student_subject_interest

Adds StudentSubjectInterest model
Avoid duplicating executed transfers

The accounting controller has a function add_required_transfers() which
essentially initializes a student's financials for a program, by creating
transfers from "accounts receivable" to the program for any required line
item types.  The transfers are deleted and re-created to ensure that they
have up-to-date line items, e.g. if the costs of the program are changed.

If this function is called for a student whose transfers have
been executed, either by submitting a payment or via an administrative
action, then more transfers would be created.  This change should avoid
the problem by not creating any new transfers for line item types that
have already-executed transfers associated with them.
Clarify credit card view template
Fix bug in IndividualAccountingController.amount_siblingdiscount()

The Program.splashinfo_objects property has user IDs as keys and booleans
(e.g. only True) as values.  The accounting controller should thus check
for the presence of the current student's ID in that dictionary, rather
than the ESPUser object representing the student.
Ensure that sibling_discount is always a Decimal