Use ES6 Map / WeakMap

ref #33