Communication is the hardest part of a distributed team. These are some of the ways we communicate. This is an evolving process, not a solved problem.
It's important to meet in person regularly. Twice a year, we have a team gathering. We meet in Bellingham, Washington in the summer and Tucson, Arizona in the winter. There's some high-level work discussion at these meetings, but it's mostly social.
Subsets of the team will also meet in person. For example, a new hire may work in person a few days a month for the first few months.
With the exception of forwarding an email from an automated system or an outside source, we almost never send email to each other.
We use Slack for both synchronous and asynchronous communication, for both work and daily workplace socialization. In addition to project-specific channels, we have a #general channel and a #random channel. When people come online, they tend to say hi in #general and some small talk and announcements happen there, too. When people are feeling a bit more talkative, they post and chat in #random.
On Mondays, we have a strictly social call over Google Hangouts that usually lasts about 20 minutes. People may talk about their weekend and whatever else comes up (thankfully, not politics). Also on Mondays, everyone sends an email to a company-wide list with some bullet points of what they worked on last week and what they plan to work on this week.
Once a month, we have a team meeting over Google Hangouts that is only work, not social. At these monthly meetings, each person talks about what they've been working on the last month and what they have planned for the next month. It's like the live version of our weekly emails, but higher-level.
For internal bug tracking, we use GitHub Issues. Different groups (e.g. developers, support, etc.) will then use and experiment with other tools appropriate for their own communication.