Refactor: Composition over inheritance.

There are now 3 different interfaces you can implement:

- Detection: Find a version within a request.
- Store: Store and retrieve the version for a request.
- Switcher: Return a custom response when the current request is
  switching versions.

With these 3 interfaces you can compose your custom Adapter to fit your
needs. Store and Switcher are optional.