* `Candidate.refine()` now accepts either `condition = ['contains', 1]` or `condition = ['contains', 2]` only; `['both', 2]` has been completely deprecated from `Candidate.refine()` (but NOT from `Appearance.sieve()`) since `['contains', 2]` is a more versatile condition that also works with `by = row` and `by = col` in `.solve_by_hidden_pairs()`.
* Changed the name of method: `.solve_by_pairs()` -> `.solve_by_pointing_pairs()`
* Checked that `start` argument is working properly on both `.solve_by_hidden_pairs()` and `.solve_by_pointing_pairs()`.
* The behaviour of `Appearance.sieve()` when `deep = True` has changed; if `deep = True`, then the method will check all the second elements of the value lists of `Appearance` so that:
1. they are all the same AND
2. all has length `condition[1]`.
If not, then the respective keys that passed `condition` are furthur removed from `Appearance`. Docstring has been added to explain this behaviour.