I'm pretty sure I don't believe that it's not a syntax error unless you cut and paste the exact output of the following:
your full pipeline.
I use the $arrayElemAt expression pretty much all the time and I can promise you it works (on my Mac even).
P.S. heck, it was still in my scrollback, and it's the exact same version of mongod - 3.2.4:
test@local:27017(3.2.4) > db.went.aggregate({$sort:{name:1,dateTimeSeen:1}}, {$group:{_id:"$name", places:{$push:{place:"$placeSeen",time:"$dateTimeSeen"}}}},{$project:{trips:"$places",places:1}},{$unwind:"$places"},{$sort:{name:1,time:1}},{$project:{"places":1, to: {$arrayElemAt:[ {$filter:{input:"$trips",as:"trip",cond:{$and:[{$ne:["$places.place","$$trip.place"]},{$lt:["$places.time","$$trip.time"]}]}}},0]}}}, {$match:{to:{$ne:null}}} )
{ "_id" : "Sue", "places" : { "place" : "B1", "time" : ISODate("2016-03-16T10:21:41Z") }, "to" : { "place" : "A1", "time" : ISODate("2016-03-16T10:24:41Z") } }
{ "_id" : "Sue", "places" : { "place" : "A1", "time" : ISODate("2016-03-16T10:24:41Z") }, "to" : { "place" : "C1", "time" : ISODate("2016-03-16T10:29:41Z") } }
{ "_id" : "Sue", "places" : { "place" : "C1", "time" : ISODate("2016-03-16T10:29:41Z") }, "to" : { "place" : "B1", "time" : ISODate("2016-03-16T10:35:00Z") } }
{ "_id" : "John", "places" : { "place" : "A1", "time" : ISODate("2016-03-16T10:25:41Z") }, "to" : { "place" : "B1", "time" : ISODate("2016-03-16T10:27:41Z") } }
{ "_id" : "John", "places" : { "place" : "B1", "time" : ISODate("2016-03-16T10:27:41Z") }, "to" : { "place" : "C1", "time" : ISODate("2016-03-16T10:29:41Z") } }