Add `Polydivisible` class

* Calculate `base`, `factors` and `digit_weights` in
  `Polydivisible.__init__` and store on the instance for cheap access
* Add `digit_weights` function to return dictionary of `divisor: mask`
  pairs for a particular `base`
* Move `search` and `divisible` methods onto `Polydivisible`
* Refactor `search` and `divisible` to use `self.base`, `self.factors`
  and `self.digit_weights`