code: def group_and_sort_leaves_by_ott_id(self):
          
          ott_id_to_sortable_list = defaultdict(list)
          for node_id in self._edge_by_target.keys():
              node_obj = self._node_by_id[node_id]
              if node_id in self._edge_by_source:
                  continue
              otu_id = node_obj['@otu']
              otu_obj = self.otus[otu_id]
              ott_id = otu_obj.get('^ot:ottId')
              is_exemplar = node_obj.get('^ot:isTaxonExemplar', False)
              int_is_exemplar = 0
              if is_exemplar:
                  int_is_exemplar = -1  # to sort to the front of the list
              sortable_el = (int_is_exemplar, node_id, node_obj, otu_obj)
              ott_id_to_sortable_list[ott_id].append(sortable_el)
          for v in ott_id_to_sortable_list.values():
              v.sort()
          return ott_id_to_sortable_list
docs: returns a dict mapping ott_id to list of elements referring to leafs mapped
          to that ott_id. They keys will be ott_ids and None (for unmapped tips). The values
          are lists of tuples. Each tuple represents a different leaf and contains:
              (integer_for_of_is_examplar: -1 if the node is flagged by ^ot:isTaxonExemplar. 0 otherwise
              the leaf's node_id,
              the node object
              the otu object for the node
              )