CLN: Specialize assert_(np.array_equal(...))

Work on #6175. This is the third (and final) "half" of the work started in #6368.
Merge pull request #6387 from bwignall/assert_6175_arrayequal_3

CLN: Specialize assert_(np.array_equal(...))
ENH: add chainmap for easier scoping
CLN: move scoping code to its own module
ENH: catch key error for chainmap lookups
CLN: give a proper name to generic index resolvers getter
ENH: pass variables to numexpr
CLN/ENH: refactor scope to use DeepChainMap and inspect.stack
TST/CLN: no need to pass scope to eval assertions
CLN/ENH: use swapkey instead of crazy hack
CLN: update expr.py for scope changes and remove unused isexpr
ENH/CLN: track scope instead of hard coding minimal stack level
CLN: no need for property nresolvers
BUG: allow scope usage if resolvers throw a key error but a resolver exists and not a local var
DOC/CLN: add internal docs and remove some straggling cruft
ENH: do not allow users to have variables that are overridden by numexpr
TST/CLN: more extensive scope tests
ENH: update pytables for new scoping
ERR/API: disallow local references in top-level calls to eval
CLN/API: move check for @ syntax (with engine) into _check_for_locals