Dead simple, lightweight "states as objects" system