BUG: Allow smaller minimum feature separation

**First:** the threshold for local maxima is set as a percentile of all grayscale values. That code is now broken out into a separate function, both to find out how long it takes (a surprisingly large fraction of the feature-finding time!), and so interested parties can learn just what the threshold value actually is.

**Second:** The feature-finding code merges local maxima that are closer than some `separation`. This PR

- Allows `separation < diameter + 1`
- To do this, makes the code that excludes local maxima from the edges of the image use `radius` (i.e. `diameter`), not `separation`, to set the size of the excluded region.
- If `separation == 0`, skips the peak-merging step entirely.
- Expands the region of allowed maxima by 1 pixel in each dimension.

This last change is validated by a test I added.

**Finally,** as a cleanup, we change the call signature of `binary_mask` to no longer take a `separation` parameter, which it wasn't using anyway.