Initial version

Defines a single command, init, which can be used to initialise a
directory for SRS.  Commands are called using a git-style "program
command" syntax, ie "srs init" in this case.  See the supplied "help"
commands and the features for more detail.
Clean up workspace layout

Remove unnecessary config file (unnecessary for now anyway), and add
soon-to-be-necessary data directory instead.
Added "add-data" command

This adds a unit of data to the workspace and returns its ID
Added "cat" command

Outputs the content matching <id>.
Renamed "add-data" to "insert-data"
Added "insert-exercise" command
Consolidated insertion commands into "insert-into"

"insert-data" and "insert-exercise" were almost exactly the same, so made one
command to do both.
Made "cat" command look in all subsections

Right now it loops through all sections looking for matces; maybe a rake-style
FileList would be a better bet.
Added "schedule" command

Schedules are created useing "schedule" rather than "insert-into" because they
are different from data and exercises.  They are named based on when they are
created, to help with ordering and also because they are regularly modified.
They will be in a separate repository from the other data and handled quite
separately, so I think it makes sense to create them in a different manner too.
Added "do-exercise" command

Runs a single exercise.  Reads the model name out of the header and looks for a
class with that name.
Added "SimpleFlashcard" model

A simple flashcard-based model to get started.  Data is expected to be a series
of fields defined each on a single line, with a colon separating the key and the
value.  Exercise metadata takes the form of free text with field keys contained
within square brackets.  Question and answer are separated by the string "---".

An example datafile:

    Question: What is the largest man-made lake in the world?
    Answer: Lake Kariba

Example exercise metadata:

    [Question]
    ---
    [Answer]

The user is shown the question and asked to enter the answer.  If their entry
matches precisely with the expected answer, they score full marks.  Otherwise,
they are shown the correct answer and asked to assess their own score.
Don't return an error code out of runModel

runModel returns a score, so returning error codes could be quite
confusing!  Returning nil instead now... will probably need to throw an
exception to handle errors.
Fix problem with header data containing colons

Previously, if you had a header with a colon in the value (for example a
time), everything after and including the colon would be lost.
Added "reschedule" command

This takes an id and a score as input, and updates the schedule
specified by that id based on the score.
Added "SuperMemo2" scheduler

This scheduler follows the SuperMemo 2 algorithm precisely, as defined
on the SuperMemo website at [1], with a sample implementation at [2].
There were two discrepancies between the text and the implementation:

1. It is not entirely clear from the text whether the E-Factor should be
   adjusted before or after the interval.  Since the E-Factor is used
   during calculation of the interval, this obviously impacts
   functionality.
2. The text reads "If interval is a fraction, round it up to the nearest
   integer," however the sample implementation follows rounding rules;
   i.e. it rounds up if the value is >= 0.5 but rounds down otherwise.

In both cases the behaviour of the implementation was favoured as its
implementation in Pascal leaves less room for ambiguity than the English
description.

One ambiguity which is not resolved by either the text or the sample
implementation is whether to adjust the E-Factor/interval in the case of
repeats (step 7 in the text).  I have chosen not to do this because I
think it would skew the results significantly; the revision period at
the end is for revision, not assessment.

Note that the SuperMemo 2 algorithm expects scores to range from 0-5,
whereas in our case the range of scores is defined by the model, and
normalised to 0.0-1.0.  The SuperMemo2 scheduler multiplies by 5 to give
scores in the range SuperMemo expects, which might not be optimal for
scores in a different range (such as those output from the
SimpleFlashcard model, which are in the range 0-3).

[1] http://www.supermemo.com/english/ol/sm2.htm
[2] http://www.supermemo.com/english/ol/sm2source.htm
Made "SimpleFlashcard" scoring more lenient

Made the scoring non-linear, so "Close" is closer to "Correct" than
"Wrong" is to "Close".  This scoring method fits better with the
SuperMemo2 scheduler, and I think provides better spacing.
Added "queue" command

Scans through the schedules directory and queues any which are due.
Queues repeats in REPEATS.
Added "next-due" and "next-new" commands

Return the id of the next due or new schedule.
Added "get-field" command

Retrieves a field from the content specified.
Added gemspec