You need to break the visits into groups. You can do this with a simple trick. If you enumerate the rows for visits and subtract from the rank, then each group will have a constant value. So, this is easy:
select visitor, min(date) as mindate, max(date) as maxdate
from (select t.*, row_number() over (partition by visitor order by rank) as v_rank
from table t
where event = 'Visit'
) t
group by visitor, (rank - v_rank);