code: def _watch(self, path, current_level, max_level):
          
  
          # ephemeral znodes can't have children, so skip them
          stat = self._client.exists(path)
          if stat is None or stat.ephemeralOwner != 0:
              return
  
          try:
              children = self._client.get_children(path, self._watcher)
          except NoNodeError:
              children = []
  
          if max_level >= 0 and current_level + 1 > max_level:
              return
  
          for child in children:
              self._watch(os.path.join(path, child), current_level + 1, max_level)
docs: we need to catch ZNONODE because children might be removed whilst we
          are iterating (specially ephemeral znodes)