pub fn parse(input: &str) -> Maze
Parsing takes two passes. First we find the location of each portal. Then we BFS from each portal to build a list of distance pairs.