docs: def snapshot(self, snap_name, metadata=None, skip_symbols=None, versions=None):
          """
          Snapshot versions of symbols in the library.  Can be used like:
  
          Parameters
          ----------
          snap_name : `str`
              name of the snapshot
          metadata : `dict`
              an optional dictionary of metadata to persist along with the symbol.
          skip_symbols : `collections.Iterable`
              optional symbols to be excluded from the snapshot
          versions: `dict`
              an optional dictionary of versions of the symbols to be snapshot
          """
          # Ensure the user doesn't insert duplicates
          snapshot = self._snapshots.find_one({'name': snap_name})
          if snapshot:
              raise DuplicateSnapshotException("Snapshot '%s' already exists." % snap_name)
  
          # Create a snapshot version document
          snapshot = {'_id': bson.ObjectId()}
          snapshot['name'] = snap_name
          snapshot['metadata'] = metadata
  
          skip_symbols = set() if skip_symbols is None else set(skip_symbols)
  
          if versions is None:
              versions = {sym: None for sym in set(self.list_symbols()) - skip_symbols}
  
          # Loop over, and snapshot all versions except those we've been asked to skip
          for sym in versions:
              try:
                  sym = self._read_metadata(sym, read_preference=ReadPreference.PRIMARY, as_of=versions[sym])
                  # Update the parents field of the version document
                  mongo_retry(self._versions.update_one)({'_id': sym['_id']},
                                                         {'$addToSet': {'parent': snapshot['_id']}})
              except NoDataFoundException:
                  # Version has been deleted, not included in the snapshot
                  pass
  
          mongo_retry(self._snapshots.insert_one)(snapshot)