Make arguments consistent across .protect() methods

Page.protect():
  - use a single 'protections' argument as in APISite.protect()
    although it defaults to 'None' it should be supplied.
  - use **kwargs to pass 'expiry' and 'cascade' to APISite.protect()
  - deprecated the 'edit', 'move', 'create' and 'upload' arguments
    they will be translated into 'protections' but ONLY if it was
    set to None (which is the case in exisiting scripts).
  - deprecated the 'unprotect' argument (not present in the API)

APISite.protect():
  - rename the 'summary' argument into 'reason' for consistency
    with the Page method and the API
  - use **kwargs to pass 'cascade' directly to Request()

Logic of 'edit', 'move', 'create' and 'upload':
  - If protections is not None, it will warn for each value which
    is not None and ignores them
  - If protections is None, it'll create protections dict from them.
    It will also warn for each value which is not None.
  - 'edit' and 'move' are now default to False, so it warns only
    if they are set explicitly in conjunction with an existing
    protections dict. It'll also warn when they are False and
    protections is None.

APISite:
  - .protection_types(): return a set of available protection types
  - .protection_levels(): return a set of available protection levels
  - ._add_siteinfo(): queries additional siteinfo
  - .getmagicwords(): uses _add_siteinfo()

Page.applicable_protections():
  - return a set of protections applicable to that page, but this
    is mostly hardcoded. But a future api.php update might fix it.

Change-Id: Ifc20770b7bbae8c86b920f8376e27d0bff47d2a3
Merge "Make arguments consistent across .protect() methods"