I don't know much, but whenever I see a system with a class named "something something manager" - it's always overdesigned.
Try to avoid implementing various managers, marshalls, dispatchers etc in advance and stay away from too much abstraction because it often leads to analysis-paralysis. Yeah, I'm not a big fan of design patterns approach to building systems.
It's almost impossible to nail the design at a first go, especially if you don't know the exact state elements it will need to handle. You can't really get away from refactoring in the real world.
One thing that v 4 introduced that's very useful for handling state are callables. So if you're implementing a discrete state machine, you can use state id indexed callables to handle your state in/out/mix/process code instead of a clunky solution with multiple nodes often shown in introductory state machine tutorials.