Sentry Issue: [POSTHOG-821](https://sentry.io/organizations/posthog/issues/3707400683/?referrer=github_integration)

Sentry is reporting that when listing session recordings loading persons is n+1

Looking at how the query works 

we 
* load person distinct ids for recordings in the list
* load the persons that have those distinct ids
* create a fict of distinct id to person
* for each of the recordings
    * look up the  person in the dict and pass them to a `PersonSerializer`
    * that looks up the person's distinct ids while choosing Person's `name`
    * (maybe only when there's no email) in order to determine the first distinct id for the person
    
 That final lookup of distinct ids is (**I think**) where the n plus 1 problem is. 
 
 For each person one at a time we go to the DB and get their distinct ids
 
 There's no foreign key from `Person` to `PersonDistinctId` so we can't utilise `select_related` here. 
 
 _maybe_ we can if we use a list serializer for Persons and then combine the two lists
 
 Some of the reports suggest 50% of the time generating the list is spent loading persons
posthog/api/test/test_session_recordings.py
self.assertEqual(first_session["id"], "2")
        self.assertEqual(first_session["distinct_id"], "user2")
        self.assertEqual(parse(first_session["start_time"]), (base_time + relativedelta(seconds=20)))
        self.assertEqual(parse(first_session["end_time"]), (base_time + relativedelta(seconds=20)))
        self.assertEqual(first_session["recording_duration"], "0.0")
        self.assertEqual(first_session["viewed"], False)
        self.assertEqual(second_session["id"], "1")
        self.assertEqual(second_session["distinct_id"], "user")
        self.assertEqual(parse(second_session["start_time"]), (base_time))
        self.assertEqual(parse(second_session["end_time"]), (base_time + relativedelta(seconds=30)))
        self.assertEqual(second_session["recording_duration"], "30.0")
        self.assertEqual(second_session["viewed"], False)
        self.assertEqual(second_session["person"]["id"], p.pk)
    def test_session_recordings_dont_leak_teams(self):
        another_team = Team.objects.create(organization=self.organization)
        Person.objects.create(
            team=another_team, distinct_ids=["user"], properties={"$some_prop": "something", "email": "bob@bob.com"}
        )
        Person.objects.create(
            team=self.team, distinct_ids=["user"], properties={"$some_prop": "something", "email": "bob@bob.com"}
        )
        base_time = (now() - relativedelta(days=1)).replace(microsecond=0)
        self.create_snapshot("user", "1", base_time, team_id=another_team.pk)
        self.create_snapshot("user", "2", base_time)
        response = self.client.get(f"/api/projects/{self.team.id}/session_recordings")
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        response_data = response.json()
        self.assertEqual(len(response_data["results"]), 1)
        self.assertEqual(response_data["results"][0]["id"], "2")
    def test_session_recording_for_user_with_multiple_distinct_ids(self):