Throw an exception on redefined object instantiation

If an object has already been instantiated, there should be an exception when a developer tries to redefine the instantiation method.

Before this PR, redefinitions of this type are silently ignored leading to unexpected behaviour.

This conflicts with #340 - here I am throwing an exception, in the other PR we are un-instantiating the object. Discussion of why I think this is a better approach can be found on that PR.

This closes #340 and #288