Removes logging, throwing is better.

* Loggint a message before throwing a runtime exception was pretty
  weak - a poor choice, if you mind. It is better to just throw
  the exception with the same message, keeping the user informed
  and at the same time invoking a true fail-fast behaviour.

* Tests are extended with a separate test class to better show
  the provides type-specification, we provide object of T for
  any type of T declaration, be it an abstract or concrete.