Method 1
This tackles the problem with packages xifthen and pgffor.
\documentclass{article}
\usepackage{etoolbox, xifthen, pgffor, advdate}
%% counter for number of lecture
\newcounter{nlecture}\setcounter{nlecture}{1}
%% denote holiday when found
\newbool{holiday}
%% advance date
\newcommand{\DoLecture}{%
\global\boolfalse{holiday}%%%
\foreach \D in \holidaylist
{%
\ifthenelse{\equal{\today}{\D}}
{%
\global\booltrue{holiday}%%%
\breakforeach
}
{}%%%
}%%%
\ifbool{holiday}
{%
Holiday - \today
\AdvanceDate[7]%%%
\DoLecture
}
{%%%
Lecture \thenlecture{} - \today
\stepcounter{nlecture}%%%
\AdvanceDate[7]%%%
}%%%
}
%% start date for lectures
\ThisYear{2019}\ThisMonth{3}\ThisDay{1}
%% holiday list
\newcommand{\holidaylist}{{March 8, 2019}, {March 22, 2019}, {March 29, 2019}}
\renewcommand{\baselinestretch}{1.5}
\begin{document}
\DoLecture
\DoLecture
\DoLecture
\DoLecture
\DoLecture
\DoLecture
\end{document}
This gives the result below.

CAVEAT 1 - As noted elsewhere, doing string comparisons in \ifthenelse eats up TeX memory.
I leave as an exercise for the reader the development of a method to put the \DoLecture command in a loop, perhaps using \foreach. One problem is that \AdvanceDate does not work directly within a \foreach loop.
Method 2
This tackles the problem with the package datatool. I prefer this approach.
\documentclass{article}
\usepackage{etoolbox, datatool, advdate}
%% counter for number of lecture
\newcounter{nlecture}\setcounter{nlecture}{1}
%% denote holiday when found
\newbool{holiday}
\newcommand*{\theholiday}[1]{}
%% step through lectures
\newcommand{\StepThruLectures}[2]{%
\global\boolfalse{holiday}%%%
\DTLforeach*{holidays}
{\hdate=date, \event=event}
{%
\DTLifstringeq*{\today{}}{\hdate{}}
{%
\global\booltrue{holiday}%%%
\renewcommand{\theholiday}{\event}%%%
\dtlbreak
}
{}%%%
}%%%
\ifbool{holiday}
{%
\HolidayHeader{\today}{\theholiday}%%%
\AdvanceDate[7]%%%
\StepThruLectures{#1}{#2}%%%
}
{%
\LectureHeader{\today}{\thenlecture}{#1}{#2}%%%
\stepcounter{nlecture}%%%
\AdvanceDate[7]%%%
}%%%
}
%% generate lecture and holiday statements
\newcommand{\LectureHeader}[4]{#1: Lecture #2 - Topic: #3 / Reading: #4}
\newcommand{\HolidayHeader}[2]{#1: Holiday - #2}
%% start a date
\ThisYear{2019}\ThisMonth{3}\ThisDay{1}
% set the lecture topics
\begin{filecontents}{lectures.csv}
topic, reading
Introduction, none
Math is Fun, Chapter 1
Math is Hard, Chapter 2
\LaTeX{} is Preferred, Chapter 3
Conclusions, none
\end{filecontents}
% set the holidays
\begin{filecontents}{holidaylist.csv}
date, event
{March 8, 2019}, my birthday
{March 22, 2019}, a special day
{March 29, 2019}, tornados
\end{filecontents}
\DTLloaddb{holidays}{holidaylist.csv}
\DTLloaddb{lectures}{lectures.csv}
\renewcommand{\baselinestretch}{1.5}
\begin{document}
% uncomment next lines to show databases
%\DTLdisplaydb{lectures}
%\DTLdisplaydb{holidays}
\begin{DTLenvforeach}{lectures}%
{\topic=topic, \read=reading}
\StepThruLectures{\topic}{\read}
\end{DTLenvforeach}
\end{document}
Here is the output.

The advantage of this approach is that you can generate your lecture topics and have them ready in a CSV file that is immutable each term. All you need to do in any given term is set the start date and the CSV for the holidays. The compilation will automatically generate your lecture schedule for that term.
CAVEAT - As noted with datatool, when the database is large, this will be slow.
Other Notes
I still believe the calendars package could likely do this and more, perhaps with a lot more grace.