## Bug description

Support refreshing all dashboard items. This feature was temporarily removed because it wasn't working properly)

## Expected behavior
- All dashboard items should be properly refreshed and the `items` object in the `dashboardLogic` should contain the latest information.
- From user feedback. I expect items to be automatically refreshed every hour or so (e.g. if I'm a marketer that looks at graphs continuously during the day, or have a screen dedicated just to metrics).


## How to reproduce

1. Create a dashboard with multiple items
2. Attempt to refresh all and check the last refresh timestamp for each item (remember to uncomment relevant code)

## Environment

- [X] PostHog Cloud
- [X] self-hosted PostHog, version/commit: _please provide_

## Additional context
Follow-up to #3363

## Technical context

When refreshing all dashboard items (via `refreshAllDashboardItems()`) not all items are consistently refreshed all the time. Tested for instance with a dashboard with a couple of mixed (different type) graphs. Some items are still kept on "last refreshed 10 minutes ago".

In addition to the above, as originally reported on #3608, when calling `refreshAllDashboardItems` we update each item in their own scope, which means that the general `items` object in the upper scope logic (`dashboardLogic.js`) doesn't get updated. Not sure if we should propagate the change upwards, re-fetch everything, or just do a general refresh.

The UX problem this is causing is that the "Last refreshed" label now introduced in the dashboards gets outdated because `items` doesn't get updated. Having this object with outdated information also leads to other confusing UX issues.


#### *Thank you* for your bug report – we love squashing them!

posthog/api/test/test_dashboard.py
self.client.logout()
        dashboard = Dashboard.objects.create(team=self.team, share_token="testtoken", name="public dashboard")
        test_no_token = self.client.get(f"/api/dashboard/{dashboard.pk}/")
        self.assertEqual(test_no_token.status_code, status.HTTP_403_FORBIDDEN)
        response = self.client.get(f"/api/dashboard/{dashboard.pk}/?share_token=testtoken")
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.json()["name"], "public dashboard")
    def test_shared_dashboard(self):
        self.client.logout()
        Dashboard.objects.create(
            team=self.team, share_token="testtoken", name="public dashboard", is_shared=True,
        )
        response = self.client.get("/shared_dashboard/testtoken")
        self.assertEqual(response.status_code, 200)
    def test_share_dashboard(self):
        dashboard = Dashboard.objects.create(team=self.team, name="dashboard")
        response = self.client.patch("/api/dashboard/%s/" % dashboard.pk, {"name": "dashboard 2", "is_shared": True},)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        dashboard = Dashboard.objects.get(pk=dashboard.pk)
        self.assertIsNotNone(dashboard.share_token)
    def test_no_team_dashboards_list(self):
        self.team.delete()
        response = self.client.get("/api/dashboard/")
        self.assertDictEqual(
            response.json(), {"attr": None, "code": "not_found", "detail": "Not found.", "type": "invalid_request",},
        )
        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
    def test_return_cached_results(self):