An improvement to the CSV reading script

This fixed a major bug that I didn't even know I had -- the dateEvent
hash keys were unsorted, whereas the dates from the CSV were most
definitely sorted, meaning that the attendance was getting put into the
wrong slots. Argh. Good thing I've done a lot of testing.
First cut at attendance report

This just creates the data structures for now. Next step will be
generating a CSV for Steve to import into a spreadsheet.
Add absences to the attendance
Handle appearances during vacation

Show whether someone showed up at rehearsal even though they were on
vacation or hiatus.
Create CSV with custom sorting

Adds a custom sort function to sort based on part, and then on name. The
complicated part is that we sort with the Tenors first, then Leads,
Basses and Baritones, handling the multi-part voices according to the
first voice in their definition.