New mixer API

For you interested. Still work in progress. Do not merge.

Addresses #665.
To me this feels like it doesn't belong in a base class with a minimal API. This could either be moved to core, though that would be a bit more back and forth. Or we could have a state tracker helper which implementations could use to get this behavior.