Separate concerns in MimicCore somewhat so that it's easier to follow what the code is doing.

As @cyli pointed out while pair programming today, the implementation of `MimicCore` is a little squirrelly and difficult to follow.  Let's try to split out the responsibilities of the core into separate modules and simplify their implementation where possible so that it's easier for contributors to understand just by reading the code.