CandidateSession.exitUrl now arbitrary length

This had been limited to 128 characters previously, which was causing
problems for Kingston. Now set to arbitrary length.
Improvement to arg checking in bindResponses()

Moved all argument checking to the start of the method to ensure
they don't happen after state changes.
Improved LTI bad result log messages
Enhanced LIS outcomes settings validation

Added check to ensure that the supplied maximum is really larger
than the supplied minimum value.
Fixed trivial typo in comments
Part fix for issue #30: 1-N for QueuedLtiOutcome

I've added functionality for a CandidateSession having many
QueuedLtiOutcomes, and the CandidateItemSessionController now correctly
updated the closed flag for CandidateSessions after every action,
possibly registering a new QueuedLtiOutcome every time the session
closes.

I next need to update the LTI result returning to ensure that results
always go back in the correct order, which would normally be the case
but might go out of order if there is a transient failure somewhere.
LIS results nullified on session close

This is to handle the case where a session may be close multiple times,
which can happen when delivering items. This ensures the recorded LIS
data is always in sync if the pre-conditions for sending LIS results
back fail.
Change to LTI result return logic

This is in light of recent changes that allow multiple LTI
results to be returned for a single CandidateSession. We now
check each batch for multiple results in discard all but the last
one. Provided the result returning is always called serially (which it
currently is due to the way it is invoked via ScheduledService), then
this will ensure that the final result always gets back, or at least
tries more than any other result to get back.
This class is no longer required.

We removed the email sending logic earlier as it's not currently
required.
Tidied up last few commits