ENH: make closed part of IntervalDtype
- [x] closes #19371
- [ ] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry

cc @jschendel

Still need to figure out what to do for backwards compat for unpickled IntervalDtype objects; ATM this just sets closed=None.

This causes IntervalIndex.append to cast to object dtype instead of raising if we try to append a non-matching closed.  I think thats the right thing to do, but we haven't fully discussed that xref #37774
updated to fix doctests, raise on mismatched 'closed'.  still not wild about how we're handling old pickles, and ATM still allowing closed=None to be passed to the constructor mothballing to clear the queue while i figure out the pickle thing locally.