WIP: Initial changes to split delete!(h::Dict,key) into pop!(), delete!() (#3405)

As discussed in #3405, here are some exploratory changes to split `delete!(h::Dict, key)` into two functions.

* `pop!(h::Dict, key)` returns the value removed from `h`
* `delete!(h::Dict, key)` discards the value and returns the modified dictionary

Also implemented for `Set()`, `IntSet()`.  Haven't touched `ObjectIdDict` or `WeakKeyDict`.