generic getter/setter/traverser for complex data structures (port of Haskell's Lens)