fix: use numbered placeholders in cursor WHERE clause for PostgreSQL
The build_cursor_where_clause function was using literal '?' placeholders,
which works for SQLite but fails on PostgreSQL (which needs $1, $2, etc.).
Now accepts a start_index parameter and uses executor.placeholder() to
generate the correct format for each database dialect.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>