You have the point distance tool Point Distance—Help | ArcGIS for Desktop
but the results could obviously be quite large.  a search radius would reduce this but obviously might not suit most use cases.
When you get the table you could then wrangle it, something like create a cursor and produce a dictionary of all input OIDs as a key, the value being a list of  a list - [[distance, OID], [distance, OID], [distance, OID]....].  Iterate over the dictionary, sort the values and select the 3 smallest values and grab the OIDs.
This wouldn't be very hard to implement, though I do hope someone has a more trivial way.