## 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/tasks/update_cache.py
result: Optional[Union[List, Dict]] = None
    filter_dict = json.loads(payload["filter"])
    team_id = int(payload["team_id"])
    filter = get_filter(data=filter_dict, team=Team(pk=team_id))
    if cache_type == CacheType.FUNNEL:
        result = _calculate_funnel(filter, key, team_id)
    else:
        result = _calculate_by_filter(filter, key, team_id, cache_type)
    if result:
        cache.set(key, {"result": result, "type": cache_type, "last_refresh": timezone.now()}, CACHED_RESULTS_TTL)
def get_cache_type(filter: FilterType) -> CacheType:
    if filter.insight == INSIGHT_FUNNELS:
        return CacheType.FUNNEL
    elif filter.insight == INSIGHT_SESSIONS:
        return CacheType.SESSION
    elif filter.insight == INSIGHT_PATHS:
        return CacheType.PATHS
    elif filter.insight == INSIGHT_RETENTION:
        return CacheType.RETENTION
    elif (
        filter.insight == INSIGHT_TRENDS
        and isinstance(filter, StickinessFilter)
        and filter.shown_as == TRENDS_STICKINESS
    ) or filter.insight == INSIGHT_STICKINESS:
        return CacheType.STICKINESS
    else:
        return CacheType.TRENDS
def update_cached_items() -> None: