Replaced NotImplementedError with abc abstract methods

The old style way of implementing an interface / virtual methods was
to raise NotImplementedError. Python 2.7+ introduces the abc module
(AbstractBaseClass) and an abstract method decorator. Upon instantiation
of the subclass, abc will throw an exception if any of the abstract
methods is not overriden.

The previous style would only throw an exception only when the method
is called. ABC makes things fail faster.