Issue #27 Lifecycle stuff, ready for final review pass

Before I start implementing this all over the place!
Feels like `isValueSet == (cache != null)` is always true?