Made Outcome a class instead of enum

Winner takes over the role as an enumeration of possible winners.
Outcome now represents an outcome in the form of a winner and possibly
a reason for the outcome.
Public static instances are used to make the transition smoother.
Updated EventFactory accordingly and added an OutcomeTest.
EndGameEvent will need to be changed as well.
Added reasons for outcomes

- Reverted EndGameEvent back mostly to the pre-reason version. It was a
  mistake to try to add a reason to the event. It is the Outcome that must
  carry a reason. The getReason() method remains however.
- AbstractEngine specifies a reason when ending the game due to deadlock.
- StdWinDetector specifies reasons for all matching win conditions.
Updated protocol.txt with an example

Also defined the protocol more clearly for the exam mode.