## Bug description

strtobool is used in several places where it will cause deprecation warning in Pythin 3.10 and error in Python 3.12 since distutils will be removed in Python 3.12 .

Reference : https://www.python.org/dev/peps/pep-0632/

```
rg distutils                     
posthog/api/annotation.py
1:from distutils.util import strtobool

posthog/api/dashboard.py
2:from distutils.util import strtobool

posthog/api/insight.py
1:from distutils.util import strtobool

posthog/models/filters/mixins/common.py
4:from distutils.util import strtobool

posthog/settings.py
17:from distutils.util import strtobool
```

## Expected behavior

It's a good idea to vendor in the function as it's a short one.

## Environment

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


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

posthog/models/filters/mixins/common.py
@cached_property
    def session(self) -> Optional[str]:
        return self._data.get(SESSION, None)
    @include_dict
    def session_to_dict(self):
        return {"session": self.session} if self.session else {}
class OffsetMixin(BaseParamMixin):
    @cached_property
    def offset(self) -> int:
        _offset = self._data.get(OFFSET)
        return int(_offset or "0")
    @include_dict
    def offset_to_dict(self):
        return {"offset": self.offset} if self.offset else {}
class CompareMixin(BaseParamMixin):
    def _process_compare(self, compare: Optional[Union[str, bool]]) -> bool:
        if isinstance(compare, bool):
            return compare
        elif isinstance(compare, str):
            return bool(strtobool(compare))
        else:
            return False
    @cached_property
    def compare(self) -> bool:
        _compare = self._data.get(COMPARE, None)
        return self._process_compare(_compare)
    @include_dict
    def compare_to_dict(self):
        return {"compare": self.compare} if self.compare else {}
class DateMixin(BaseParamMixin):