`dateutil.tz` is a better fit for Python's modern timezone provider
interface, and has fewer footguns as a result.
The only significant downside is that we have to reimplement something
similar to `pytz.common_timezones` for use by our timezone vocabulary.
Fortunately this isn't too difficult.
The `__repr__` for a number of Launchpad objects included their memory
addresses. I've never found this useful for debugging, and, since these
sometimes show up in error messages on the webservice API, they could
potentially allow bypassing ASLR in attacks on the appserver. Remove
memory addresses from `__repr__` throughout.
The `update-pkgcache` script started crashing on production about a week
ago, and mysteriously started working again today without us changing
anything. Based on code inspection, the only way I can see for this
particular crash to happen is if a binary was deleted between
`DistroSeriesPackageCache.findCurrentBinaryPackageNames` and
`DistroSeriesPackageCache._update` (`update-pkgcache` is slow enough
that it makes many commits along the way, so this is possible), and
simulating that in a test reproduces the same crash.
It seems safe to skip the affected binary in such cases, since
`DistroSeriesPackageCache.removeOld` will eventually clean up its cache
entries.