RFC: 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`, or throws an error if the key missing
* `pop!(h::Dict, key, default)` returns the value removed from `h`, or `default` if the key is missing
* `delete!(h::Dict, key)` discards the value and returns the modified dictionary; no error thrown on missing value.

Also implemented for `Set()`, `IntSet()`.  ~~Haven't touched `ObjectIdDict` or `WeakKeyDict`.~~

**Edit:** Added info about errors, default value on `pop!()`
**Edit:** Also updated `ObjectIdDict`, `WeakKeyDict`