Atmega328p sleep Timer2 register settings

I have been working with a friend on a project to record temperature and humidity data inside of the nests of leatherback turtles on Playa Grande in Costa Rica. I have designed a custom PCB for the sensor, and am now writing the software. The sensor must be able to last 100 days (a little bit of buffer time is built in) on one battery, while recording once every 30 minutes.

Problem
The sensor needs to keep accurate time during the 100 days (± less than a minute is fine), while consuming little power.
Currently, the sensor keeps timer0 running while it sleeps so that millis() stays responsive. This means the processor wakes up every few ms to service the timer overflow interrupt, which is less than ideal. I also have a 32.768khz watch crystal on the clock input for more accurate timekeeping because the internal RC oscillator is inaccurate, adding to the downsides of this method. I would not like to run the processor off of the crystal because it would make data download extremely slow. The most pressing problem with this technique is the sensor occasionally never wakes from sleep (it takes a few days to get to this state, so it is hard to study).

Wanted solution
I came across the asynchronous mode for timer2 where you can set up the timer to run from an external clock source (such as my 32khz crystal). I have started implementing this, but it seems like it is not working properly. Here is my code in the context of the whole project (when run alone, the timer is still not set up properly), and here is the isolated important part:

  // Clear interrupts
  TIMSK2 = (0 << TOIE2) || (0 << OCIE2A) || (0 << OCIE2B);

  // Set clock source
  ASSR = 0;
  ASSR |= (0 << AS2);
  TCCR2B = 0;

  // Init counter
  TCNT2 = 0;

  OCR2A = 100;
  OCR2B = 0;

  TCCR2A = 0;
  TCCR2B = 0;

  // check ASSR to ensure writes worked

  // wait for TCN2xUB OCR2xUB and TCR2xUB

  // clear interrupt flags
  delay(10);
  TIFR2 = 0;

  // Start counter
  TCCR2B = (1 << CS22) || (1 << CS21) || (1 << CS20);
  ASSR |= (1 << EXCLK);
  
  // wait for clock to stabilize
  Serial.println("Waiting for clock...");
  delay(1000);
  
  
  Serial.println("enabled interrupts");
  Serial.flush();
  // Start interrupts
  //TIMSK2 |= (1 << TOIE2);
  delay(1000);
  
  // Stop interrupts
  TIMSK2 = 0;
  Serial.println("disabled interrupts");
  Serial.flush();
  for (int i = 0; i < 100; i++) {
    Serial.println(TCNT2);
    delay(0);
  }

Problematic Behavior
What happens is when I print out the counter values is the clock appears to be counting too quickly. I tried printing out the values in the tightest loop I could make, and that still was not fast enough (meaning the timer is using the system clock and not the external crystal). I think that I am not setting up the counter properly. Page 151 is the relevant manual page.

If anyone has any experience or could help me with this problem, any advice would be welcome!

More information on the project: http://yoerik.com/Turtle.pdf