Add diminished returns when a player has earned too much XP

When a player reaches a certain (configurable) threshold value of total
XP earned in a specific skill, his earned XP in this skill will be
decreased.

Depending on how far the player has exceeded the threshold value, his
XP will decrease more. After the (configurable) time interval of 10
minutes, the registered data will be cleared and the player can earn XP
as normal again.
Rolling xp diminishing returns

This adds on top of the diminishing returns system a mechanic such that gains will expire the configured number of minutes after they occured, rather than all being reset at once.

This prevents someone from not getting diminishing returns on the xp gain they recieved just before the reset would have occured.

Obligatory explanatory graphs: http://i.imgur.com/uSzicIR.png
Remember to remove the xp from rollingSkillsXp when we clean.

Additionally it may be possible, although unlikely for rollingSkillsXp to be a small negative value, due to the use of float values.  This will need to be watched for, but otherwise can be left alone as if it occurs it should be insignificant.
Account for skill and global experience modifiers
Don't set negative xp values
Check if it's greater then zero before scheduling the task
Cleanup
Get correct xp amount. This is pretty important.
Don't calculate diminshed returns when subtracting XP

Any penalty XP that goes through the event after diminished returns has activated would be cancelled by this listener. This bails out early if the event is subtracting.