Make the mirror selection engine an interface

Doing so will allow the engine to be replaced or even selected at
runtime.