m_ident Close the ident socket when the object is culled instead of using hooks
m_channames Call ValidateChans() from cull() on unload

This ensures that if ValidateChans() removes everyone from a channel the
channel is added to the cull list at the right time, that is, before the
destruction of objects begin.

The core IsChannel() is less strict than us regardless of our
configuration (for now) but nevertheless this is the correct behavior.
m_channames Remove temporary vector from ValidateChans()
Relax fd bounds checking

We can cope with fds greater than SocketEngine::GetMaxFds() since 3752b3f59d5216d7dc6221a361efc76b9ad2273d
socketengine_epoll Pass a dummy value to epoll_create() that does not depend on GetMaxFds()

From man epoll:
Since Linux 2.6.8, the size argument is unused, but must be greater than zero. (The kernel dynamically sizes the required data structures without needing this initial hint.)
Change the number reported by SocketEngine::GetMaxFds() to be informal

Do not exit if we can't determine it
m_ssl_openssl Remove unused MAX_DESCRIPTORS define
Deduplicate ParseStack::ParseFile() and ParseExec()
Use std::find() in ParseStack::ParseFile()
m_remove Manually forward all REMOVE messages, turn FPART into REMOVE
m_remove Recognize /REMOVE <chan> <nick>

The old syntax is now deprecated

Fixes issue #860 reported by @Shawn-Smith
m_remove Make the protected rank configurable instead of hardcoding it to 50000

Change type of ulevel and tlevel to unsigned int
Document the config options of m_remove
Move pre-kick checks from core to cmd_kick (core_channel)
Change Channel::KickUser() to accept an iterator, add overload that accepts a User

Remove srcmemb parameter
Use the iterator version of Channel::KickUser() in a few places
cmd_kick Assign a value to the kick reason string more reasonably
m_spanningtree Allow callers of InsertCurrentChannelTS() to customize positions
Add channel TS to server-to-server INVITE to detect and drop unauthorized invites

The syntax of the server-to-server INVITE command changes from
:<source> INVITE <target> <channel> [<expire>]
to
:<source> INVITE <target> <channel> <chants> [<expire>]
Return the newly created Membership object from Channel::ForceJoin()