So I solved this by creating a copy of UICenterOnChild component, and changing the way it sets what child to center on. Luckily, I didn't have to touch UIDraggablePanel at all

Here are the short list of changes:
When the component initializes, I keep a reference of the child that is currently centered to.
Line 64 changes from:
if (mDrag.panel == null) return;
to:
if (mDrag.panel == null)
{
List<Transform> closestList = GameObjectUtils.GetChildrenSortedByDistance(this.transform, this.transform.position);
mCenteredObject = closestList[0].gameObject;
return;
}
Now, I can make sure that I will never overshoot by checking the new child's index and the last child's index in the sorted by distance list. If it's greater than 1, I will clamp it, so it will always choose 1 towards the moment and not further. Of course, this assumes that the child game objects are named in a way so that they are sorted by name (i.e. Page1, Page2, Page3, etc).
Line ~104 changes from:
if (closest != null)
{
mCenteredObject = closest.gameObject;
to:
if (closest != null)
{
if (mCenteredObject != null)
{
// Overshoot protection
int startingIndex = GameObjectUtils.GetChildIndex(trans, mCenteredObject.transform);
if (Mathf.Abs(closestIndex - startingIndex) > 1)
{
int clampedIndex = Mathf.Clamp(closestIndex - startingIndex, -1, 1);
int validIndex = Mathf.Clamp(startingIndex + clampedIndex, 0, trans.childCount - 1);
closest = trans.GetChild(validIndex);
}
}
mCenteredObject = closest.gameObject;
Finally, to make it super sensitive, I multiply the momentum with 10,000 so that the littlest move will force it to move to the next child, but due to the overshoot protection, it will never go farther than just the next.
Line ~81 changes from:
Vector3 offsetCenter = center - mDrag.currentMomentum * (mDrag.momentumAmount * 0.1f);
to:
Vector3 offsetCenter = center - (mDrag.currentMomentum * 10000) * (mDrag.momentumAmount * 0.1f);
Finally, on the UIDraggablePanel, I set the scale.x to 0.6 (this is a case-by-case thing though), so that, no matter how fast the user tries to swipe the page, the speed won't allow it to go past one page.