Implement :lazy.

Upon testing lazy several things were clear:
* There was insufficient testing around premature definition of ivars.
* ivars were being defined with nil when no initializer was created.

This is resolved by more precisely checking if initialization should
happen & by adding tests around ivar definition.
Refactor tests, improve coverage, fix methods.

Improved tests indicated that predicate an clearer were not ideally
implemented. Predicate now uses instance_variable_defined? and clearer
uses remove_instance_variable.
Update TODO.
Break out :has specs.