alternative constructors shouldn't hardcode their return types
Currently, alternative constructors like Collection.from_dict define the return type as "Collection". https://github.com/stac-utils/pystac/blob/2e76a877b02eccf4d8e8ec6ad7b4aa7cf09aa268/pystac/collection.py#L607-L615
This makes is hard for subclasses to properly override the methods, since they'll be returning the subclasses type.
See something like https://stackoverflow.com/a/44644576/1889400 or https://mypy.readthedocs.io/en/stable/more_types.html?highlight=classmethod#precise-typing-of-alternative-constructors.
I've used the technique described in the first stack overflow link with success, example
I'm working on fixing this.
Incorrectly auto-closed by #962