BUG: PeriodDtype and IntervalDtype holding references to itself when object is deleted
Fixes this issue

```
In [1]: import pandas as pd

In [2]: import weakref

In [3]: pdt = pd.PeriodDtype(freq="D")

In [4]: ref = weakref.ref(pdt)

In [5]: del pdt

In [6]: import gc; gc.collect()
Out[6]: 1119

In [7]: ref()
Out[7]: period[D]

In [8]: idt = pd.IntervalDtype("interval[int64, right]")

In [9]: ref2 = weakref.ref(idt)

In [10]: del idt

In [11]: import gc; gc.collect()
Out[11]: 615

In [12]: ref2()
Out[12]: interval[int64, right]
```

1. For `IntervalDtype` the cache didn't really seem to improve performance now it's not used
2. For `PeriodDtype` just caching the period freq code instead of the created object

```
# PR

In [2]: %timeit pd.IntervalDtype("interval[int64, right]")
11.1 µs ± 13 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

In [3]: %timeit pd.PeriodDtype(freq="D")
22.2 µs ± 135 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

# main

In [2]: idt = pd.IntervalDtype("interval[int64, right]")

In [3]: %timeit pd.IntervalDtype("interval[int64, right]")
14 µs ± 28.6 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

In [4]: pdt = pd.PeriodDtype(freq="D")

In [5]: %timeit pd.PeriodDtype(freq="D")
22.2 µs ± 182 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
```
mypy complaint, otherwise looks good