(Updated) One way:
;WITH cte AS
(SELECT convert(nvarchar(max),';'+name+';') namelist, t.Name, t.friends
FROM @t t WHERE name = 'Joe'
UNION ALL
SELECT convert(nvarchar(max),c.namelist+c.Friends+';'),
c.Friends,
case c.friends when t.name then t.friends else t.name end
FROM cte c
JOIN @t t
ON c.friends IN (t.name, t.friends) AND
charindex(';'+case c.friends when t.name then t.friends else t.name end+';',
c.namelist)=0
)
SELECT name FROM cte UNION SELECT friends FROM cte
OPTION (maxrecursion 0)
SQLFiddle here.