surface: move frame callbacks out of state
As frame callbacks aren't cached anyway, they can be handled separately from the state logic.
Due to an influx of spam, we have had to impose restrictions on new accounts. Please see this wiki page for instructions on how to get full permissions. Sorry for the inconvenience.
As frame callbacks aren't cached anyway, they can be handled separately from the state logic.