The biggest problem in a formula solution is the structure of your database and having multiple dates with other text in the same cell. Here are several options & I know they're not what you're looking for:
Opt 1. Redesign your database so you actually have 2 separate tables that could be linked by name (or a unique identifier). One table contains names, addresses, emails, etc with 1 row per name. The other table contains 3 columns: name, type of date (eg: birthday, anniversary, etc) and date. This date table would have multiple rows for each individual - one row per date type per individual. You'd be able to sort the dates exactly as you wish and also use a pivot table if you wanted to display them across monthly columns like your current structure.
Opt 2. Sort your current database with the current month as primary, next month as secondary - this won't be the exact order your looking for but it will be usable unless your list of names is very long.
Opt 3. The biggest obstacle in your current database is having multiple dates in the same cell. If there was only 1 date per cell, this formula solution would work:
a) Assume Jan-Dec is in Cols B thru M respectively with headers in row1 and data starting in row 2
b) Enter this formula in N2 and copy across to Y2 and down to the end of data: =IF(--RIGHT(B2,5)<=TODAY(),DATE(YEAR(TODAY())+1,LEFT(B2,2),RIGHT(B2,2)),--RIGHT(B2,5))
c) Enter this formula in Z2 and copy down to the end of data: =MIN(N2:Y2)
The formula in b) gives the date (m/d/y) that an occasion will next occur based on todays date. Eg: if a birthday is 3/28, the calculated date would be 3/28/2013; if a birthday was 3/1, the calculated date would be 3/1/2014.
The formula in c) gives the next date that individual has an occasion, so you can sort this column. The disadvantage is if the individual has a birthdate on 3/15 and anniversary on 3/16, only the first date will show.
One other suggestion - you said you're entering using this formula ="Birthday"&CHAR(10)&TEXT(DATE(2013,3,31),"MM/DD")
you could actually just type directly into the cell:
Birthday (then hit Alt-Enter together) 0331
The Alt-Enter keys hit together is CHAR(10) and it should display the same way in the cell - just might be an easier entry method than the formula.